Comment puis-je utiliser une bibliothèque dans plusieurs classes w / o obtenir des erreurs « définition multiples »
-
28-10-2019 - |
Question
Je commence un nouveau projet C ++ et je veux utiliser Boost.Build / bjam.
Je suis en train de « définition multiples » erreurs parce que, je pense que peut-être, le fichier jam est pas correctement écrit ou je ne suis pas compris les en-têtes correctement ou, peut-être, la bibliothèque est pas bien écrit, que je ne l'ai pas étudié.
main.cpp utilise Liba. rest.cpp utilise Liba.
Liba est une bibliothèque d'en-tête. Par conséquent, je dois inclure les en-têtes pour Liba dans les deux main.cpp et rest.cpp du compilateur se plaint de namespaces etc ...
J'utilise gcc sur debian.
Voici mes fichiers de confiture:
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 ;
Les erreurs que je reçois sont des répétitions de:
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
La solution
rapport semble pertinente: il semble que cette bibliothèque « en-tête uniquement » a glissé sur un certain nombre de choses qui ne sont pas vraiment juste en-tête uniquement.