Linkfehler o.0
-
Abend,
Ich habe ein Makefile
CXX = g++ CXXFLAGS = -pipe -O2 -Wall BOOST = -I/usr/local/include/boost-1_33_1 BOOSTLD = /usr/local/lib/libboost_program_options-gcc.a \ /usr/local/lib/libboost_regex-gcc.a OBJECTS = dragonbot.o funct_opt.o funct_log.o funct_irc.o TARGET = dragonbot all: dragonbot dragonbot: ${OBJECTS} ${CXX} ${OBJECTS} ${BOOSTLD} -o ${TARGET} -strip -s ${TARGET} dragonbot.o: dragonbot.cpp dragonbot.hpp ${CXX} ${BOOST} -c dragonbot.cpp funct_opt.o: funct_opt.cpp dragonbot.hpp ${CXX} ${BOOST} -c funct_opt.cpp funct_log.o: funct_log.cpp dragonbot.hpp ${CXX} ${BOOST} -c funct_log.cpp funct_irc.o: funct_irc.cpp dragonbot.hpp ${CXX} ${BOOST} -c funct_irc.cppWie man entnehmen kann, wir ueberall dragonbot.hpp included
/* ... cut BSD Lizenz */ #ifndef DRAGONBOT_HPP #define DRAGONBOT_HPP #include <boost/program_options.hpp> #include <string> // Using namespace to ... namespace bpo = boost::program_options; namespace dbot{ // Variablen bpo::variables_map vm; std::string progname; int sock; // Function definition void start_irc(void); void start_dbot(void); void send_irc(std::string); std::string read_irc(void); void printf(std::string); void printf_err(std::string); void print_irc(std::string); void printo(std::string); void printo_err(std::string); void make_options_map(int, char *[]); } #endifNun, wenn ich es compilieren will, geht alles bis er es zusammen fuehgen will.
-bash-3.00$ make g++ -I/usr/local/include/boost-1_33_1 -c dragonbot.cpp g++ -I/usr/local/include/boost-1_33_1 -c funct_opt.cpp g++ -I/usr/local/include/boost-1_33_1 -c funct_log.cpp g++ -I/usr/local/include/boost-1_33_1 -c funct_irc.cpp g++ dragonbot.o funct_opt.o funct_log.o funct_irc.o /usr/local/lib/libboost_prog ram_options-gcc.a /usr/local/lib/libboost_regex-gcc.a -o dragonbot funct_opt.o(.bss+0x0): multiple definition of `dbot::vm' dragonbot.o(.bss+0x0): first defined here funct_opt.o(.bss+0x20): multiple definition of `dbot::progname' dragonbot.o(.bss+0x20): first defined here funct_opt.o(.bss+0x24): multiple definition of `dbot::sock' dragonbot.o(.bss+0x24): first defined here funct_log.o(.bss+0x0): multiple definition of `dbot::vm' dragonbot.o(.bss+0x0): first defined here funct_log.o(.bss+0x20): multiple definition of `dbot::progname' dragonbot.o(.bss+0x20): first defined here funct_log.o(.bss+0x24): multiple definition of `dbot::sock' dragonbot.o(.bss+0x24): first defined here funct_irc.o(.bss+0x0): multiple definition of `dbot::vm' dragonbot.o(.bss+0x0): first defined here funct_irc.o(.bss+0x20): multiple definition of `dbot::progname' dragonbot.o(.bss+0x20): first defined here funct_irc.o(.bss+0x24): multiple definition of `dbot::sock' dragonbot.o(.bss+0x24): first defined here collect2: ld returned 1 exit status *** Error code 1 Stop in /home/pascal/dragonbot (line 14 of Makefile).Das ist ein BSD Makefile. Er linkt dragonbot.hpp mehrmals, das sollte
er aber nicht, da ich ja #ifndef #define ... #endif im dbot.hpp habe.hat jemand ne idee wie man das umgehen koennte?
Gg
-
Ich habe jetzt schon
g++ dragonbot.cpp funct_opt.cpp funct_irc.cpp funct_log.cppversucht, mit dem gleichen ergegnis.
kann es sein, das ich bei den anderen daten(cpp) die dragonbot.hpp nicht
includen darf?Gg
-
Nein, das kann nicht sein. Du darfst die hpp nicht mit linken (Header-Dateien werden niemals gelinkt).
-
na ist doch klar. du darfst die variablen nicht in einer header-datei definieren. aus demselben grund hast du doch die ganzen funktionen nur deklariert, und die implementation auf das zugehörige cpp-file ausgelagert. dasselbe musst du mit den variablen machen.
die include-guards helfen auch nicht gegen solche linker-fehler, das wird hier alle 2 tage propagiert.@Z2: wozu schreibt man dann headerdateien überhaupt

-
Damit man sie inkludiert und nicht linkt. Trifft hier allerdings auch nicht zu (das mit dem verbotenen linken). Sorry, hab mich verlesen.
-
Gut das ist einleuchtend,
ist auch schon lange her, dass ich so geprogt habe.Aber mal ne frage...
Wo soll ich die variablen definieren, das sie ueberall bekannt ist?
Meinst du im sinne von:g++ -c variablen.cpp g++ -c funct_x.cpp variablen.o g++ -c funct_y.cpp variablen.o g++ xx.o xx.o xx.o -o progoder wie kann ich das verstehen?
Ich stehe irgenwie auf dem schlauch.THX,
Gg
-
In deinem Header schreibst du vor alle drei Variablendefinitionen ein "extern" - damit werden sie dort nur deklariert (reserviert keinen Speicher, macht aber den Namen überall bekannt). Und definieren kannst du die Variablen dann in der Datei, in der du auch die dbot:: Funktionen definiert hast.
-
CStoll schrieb:
In deinem Header schreibst du vor alle drei Variablendefinitionen ein "extern" - damit werden sie dort nur deklariert (reserviert keinen Speicher, macht aber den Namen überall bekannt). Und definieren kannst du die Variablen dann in der Datei, in der du auch die dbot:: Funktionen definiert hast.
das gute alte extern ^^
Danke, hat natuerlich geklapt.Gg