如何在多个类中使用库而不会出现“多重定义”错误

时间:2012-01-13 18:16:39

标签: c++ bjam multiple-files boost.build

我正在开始一个新的c ++项目,我想使用Boost.Build / bjam。

我遇到了“多重定义”错误,因为我认为可能没有正确编写jam文件,或者我没有正确地包含标题,或者,库可能写得不好,我没有调查过。

main.cpp使用libA。 rest.cpp使用libA。

libA是一个头库。因此,我需要在编译器的main.cpp和rest.cpp中包含libA的头文件,抱怨命名空间等...

我在debian上使用gcc。

这是我的果酱文件:

Jamroot.jam

import os ;
import modules ;

path-constant boost-root : "/home/dude/include/boost_1_48_0" ;
path-constant cgi-root : "/home/dude/include/cgi-0.7.1/libs/cgi/build" ;
path-constant BOOST_BUILD_PATH : "$(boost-root)/tools/build/v2" ;

# path-constant include-dir : /usr/local/include ;

use-project /boost/ : $(boost-root) ;
use-project /boost/cgi/ : $(cgi-root) ;

lib libsoci_core : : <file>/usr/local/lib/libsoci_core.so ;
lib libsoci_odbc : : <file>/usr/local/lib/libsoci_odbc.so ;
lib libboost_log : : <file>/usr/local/lib/libboost_log.so ;

Jamfile.jam

project hello_fcgi
: requirements
    <library>/boost/cgi/
    <library>/boost/system/
    <library>/boost/thread/
    <include>/usr/local/include/soci/
    <include>/usr/local/include/soci/odbc/
  ;

# exe rest : rest.cpp hello /boost/regex/ libboost_log libsoci_core libsoci_odbc ;
exe hello : main.cpp rest.cpp cms.cpp /boost/regex/ libboost_log libsoci_core libsoci_odbc ;

# Our install rule (builds binaries and copies them to <location>)
install install
 :
   hello
 :
   <location>/var/www/localhost/cgi-bin/
 ;

# Only install example if you use `bjam install' or equivalent
explicit install ;

我得到的错误是重复:

Performing configuration checks

    - has_icu builds           : yes
...patience...
...patience...
...found 3228 targets...
...updating 1 target...
gcc.link bin/gcc-4.4.5/debug/hello
bin/gcc-4.4.5/debug/rest.o: In function `basic_client':
/usr/include/c++/4.4/exception:62: multiple definition of `boost::cgi::common::basic_client<boost::cgi::common::tags::fcgi>::basic_client()'
bin/gcc-4.4.5/debug/main.o:/home/dude/include/cgi-0.7.1/boost/cgi/fcgi/client.hpp:44: first defined here

1 个答案:

答案 0 :(得分:3)

这个defect report看起来很相似:似乎这个“仅限标题”的库已经出现了一些不仅仅是标题的东西。