Hello there. I have not dabbled much in C++ in a long while but I am feeling like making a small project for fun. In this project I encountered this annoying problem on a secondary function of the application (i.e. not what it's core use is). Maybe I am just too tired and I am not seeing the horrible design or maybe I am missing something obvious :/
I have tried a few changes like moving declarations and definitions around, but it does not seem to go away.
Basically, bar.h uses a class defined in foo.h to instantiate from it and to create a macro using that instance. In turn, that macro will be used in both foo.cpp and main.cpp. I am getting the following error:I have tried the simplest code possible (stripping *everything* that is not related to this issue) and get the exact same error so I know this is what is causing me trouble.build/Debug/GNU-Linux-x86/bar.o:(.bss+0x0): multiple definition of `SOMEVAR'
build/Debug/GNU-Linux-x86/main.o:/home/alexandre/NetBeansProjects/tests/main.cpp:10: first defined here
collect2: ld returned 1 exit statuse
Here are the related files:Code:/* * File: foo.h * Author: alexandre * * Created on August 21, 2011, 12:49 AM */ #ifndef FOO_H #define FOO_H class Foo { public: void do_something(int t); }; #endif /* FOO_H */Code:/* * File: bar.h * Author: alexandre * * Created on August 21, 2011, 12:49 AM */ #ifndef BAR_H #define BAR_H #define WHATEVER #ifdef WHATEVER #include "foo.h" Foo SOMEVAR; #define SOMEMACRO(a) SOMEVAR.do_something(a) #else // WHATEVER #define SOMEMACRO(a) //does nothing #endif #endif /* BAR_H */Code:/* * File: foo.cpp * Author: alexandre * * Created on August 21, 2011, 12:49 AM */ #include "foo.h" void Foo::do_something() { // whatever }Code:/* * File: bar.cpp * Author: alexandre * * Created on August 21, 2011, 12:49 AM */ #include "bar.h"This exact code generates the error. I am using the latest version of g++ on Netbeans IDE.Code:/* * File: main.cpp * Author: alexandre * * Created on August 21, 2011, 12:48 AM */ #include "bar.h" int main(int argc, char** argv) { SOMEMACRO("whatever"); return 0; }
Finally, I have tried to add "guards" to try not to instantiate twice the same class. Apparently that does not do anything else different as I get the exact same problem.Sorry for the code dumping but I think the structure here matters a lot to the problem.Code:#ifdef WHATEVER #ifndef WHATEVER_INIT #define WHATEVER_INIT #include "foo.h" Foo SOMEVAR; #define SOMEMACRO(a) SOMEVAR.do_something(a) #endif //WHATEVER_INIT #else // WHATEVER #define SOMEMACRO(a) //does nothing #endif
Thank you very much.



LinkBack URL
About LinkBacks


