Hello: I'm coding in C++ for ARM for the first time, using Keil. I'm working in a project that already exists but I need to make some changes. I cannot change the libraries or the file's structure. The test_1 and test_2 functions use a global object and I cannot change it. Problem is, the code was created to run each test in an independent compilation, but now I need to create a menu for all the tests in a single project.
I'm having problems with the use of a global object. I want to instantiate one object in a .cpp file and use it in another .cpp file (using extern), but linker keep sayng that the object was multiple defined.
Any idea how to solve it?
Thanks.
---My project:
Library File:
// myclass.h: class myclass{ ....
Header for tests 1
// test_1.h #ifndef TST1_H #define TST1_H void test_1(void); extern myclass mc(0); // extern declaration #endif
Tests file 1
//test_1.cpp #include "my_lib.h" #include "test_1.h" myclass mc(0); void test_1(void){ mc.func1(); mc.func2(); ... }
Header for tests 2
// test_2.h #ifndef TST2_H #define TST2_H void test_2(void); extern myclass mc(0); #endif
Tests file 2
//test_2.cpp #include "my_lib.h" #include "test_2.h" void test_2(void){ mc.func1(); mc.func2(); ... }
Main cpp file
// main.cpp #include "my_lib.h" #include "test_1.h" #include "test_2.h" void main(void){ // menu for tests... ... case 1: test_1(); break; case 2: test_2(); break; }
extern myclass mc(0); // extern declaration
That's your problem right there. That's not actually a declaration. It's a definition. So your code at large is in violation of the C++ "one definition rule". You have to fix that.
Your headers also fail to pull in the type definition for "myclass" before using it. That means they can't stand on their own, which tends to create all kinds of problems down the road.
Thanks for your insights Hans. I believe the line you pointed is a definition beacuse the initialization value "0", right? I cannot change this class and the code don't compile without a value there. The problem with this code is that the functions Test_1, Test_2, etc... and some IRQ functions uses this object as global and I cannot change the code. Thanks, Rods
What error are you getting why you declare it like this?
extern myclass mc; // extern declaration
I cannot change this class and the code don't compile without a value there.
Doesn't compile, or doesn't link? The distinction is crucial. And what is "this class" that you cannot change?
Hello Robert: That was the problem! I reviwed the code and instead of
extern myclass mc;
I was using
extern myclass mc();
. I was confusing object with function. Thank you very much for your help.
Regards Rods
Hello Hans: The code was not linking. Now I corrected it and it is compiling, linking and running.
Thanks you very much for your help
regards Rods