C++ 我如何在多个课程中使用库,而不使用“获取”;“多重定义”;错误

C++ 我如何在多个课程中使用库,而不使用“获取”;“多重定义”;错误,c++,bjam,boost-build,C++,Bjam,Boost Build,我得到了“多定义”错误,因为,我想可能是因为jam文件写得不正确,或者我没有正确地包含标题,或者,可能是因为库写得不好,这是我没有调查过的 main.cpp使用libA。 rest.cpp使用libA libA是一个头库。因此,我需要在编译器的main.cpp和rest.cpp中都包含libA的头,因为编译器会抱怨名称空间等问题 我在debian上使用gcc 这是我的jam文件: 果酱 import os ; import modules ; path-constant boost-root

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

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

libA是一个头库。因此,我需要在编译器的main.cpp和rest.cpp中都包含libA的头,因为编译器会抱怨名称空间等问题

我在debian上使用gcc

这是我的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 ;
导入操作系统;
导入模块;
路径常数boost root:“/home/dude/include/boost\u 1\u 48\u 0”;
路径常量cgi根:“/home/dude/include/cgi-0.7.1/libs/cgi/build”;
路径常量BOOST\u BUILD\u路径:“$(BOOST root)/tools/BUILD/v2”;
# 路径常数include dir:/usr/local/include;
使用project/boost/:$(boostroot);
使用project/boost/cgi/:$(cgiroot);
lib libsoci_core::/usr/local/lib/libsoci_core.so;
lib libsoci_odbc::/usr/local/lib/libsoci_odbc.so;
lib libboost_log::/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 ;
project hello\u fcgi
:要求
/boost/cgi/
/增压/增压系统/
/增压/螺纹/
/usr/本地/包括/社会/
/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\u log libsoci\u core libsoci\u odbc;
#我们的安装规则(生成二进制文件并将其复制到)
安装
:
你好
:
/var/www/localhost/cgi-bin/
;
#仅当您使用'bjam 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
执行配置检查
-你有没有想过:是的
……耐心。。。
……耐心。。。
…找到了3228个目标。。。
…正在更新1个目标。。。
gcc.link-bin/gcc-4.4.5/debug/hello
bin/gcc-4.4.5/debug/rest.o:在函数“basic_client”中:
/usr/include/c++/4.4/exception:62:boost::cgi::common::basic_client::basic_client()的多个定义
bin/gcc-4.4.5/debug/main.o:/home/dude/include/cgi-0.7.1/boost/cgi/fcgi/client.hpp:44:首先在这里定义

这看起来很相关:这个“仅页眉”库似乎在一些不只是页眉的事情上出错了。

这看起来很相关:这个“仅页眉”library在一些事情上出现了失误,这些事情实际上不仅仅是标题。

您是否使用#ifndef-guards?Rest.cpp包含两个标题?@平淡,导入?那会在jam文件中吗?@sims我想平淡就是头文件。也就是说,如果在编译时有多个已定义的符号,则可能会两次包含一个标头而没有对其进行保护,即此
#ifdef
#define
#endif
舞蹈。但是,错误消息看起来好像在链接时得到了多个定义。@sims错误消息看起来有点混乱。然而,我不使用果酱,所以我不能评论这看起来是否正确。但是,因为我要检查rest.cpp或main.cpp是否包含了.cpp(而不是.hpp)。假设情况并非如此,我将检查这两个文件中是否存在
basic\u client
的任何显式实例化。是否使用#ifndef guards?Rest.cpp包含两个头?@insipid,imports?那会在jam文件中吗?@sims我想平淡就是头文件。也就是说,如果在编译时有多个已定义的符号,则可能会两次包含一个标头而没有对其进行保护,即此
#ifdef
#define
#endif
舞蹈。但是,错误消息看起来好像在链接时得到了多个定义。@sims错误消息看起来有点混乱。然而,我不使用果酱,所以我不能评论这看起来是否正确。但是,因为我要检查rest.cpp或main.cpp是否包含了.cpp(而不是.hpp)。假设情况并非如此,我将检查这两个文件中是否存在
basic\u client
的任何显式实例化。