I have a question that is very closely related to Linker does not emit multiple definition error when same symbol coexists in object file and static library, but concerns a slightly different situation.
Just like there, I have two .cpp files (say: test1.cpp and test2.cpp) each containing an implementation of the same function, i.e. void testfunc(). I also have a header file test.h where I declare testfunc, as well as a file main.cpp with a main function which contains a call to testfunc()like this:
include "test.h"
int main() {
testfunc();
}
I compile the .cpp files separately by invoking g++ -c *.cpp and then create a static library out of them with ar rvs libtest.a test1.o test2.o. When linking main.o against the library now, the linker does not complain as I expected it to do:
gcc main.o -L. -ltest -o main
The resulting executable works perfectly fine - calling one of the two implementations of testfunc(). To be honest, I expected some error like multiple definition of... to occur. Therefore, my questions are:
- Why is this actually working - is the reason in
ar, which only adds one of the two object files to the library, or does the library contain both object files & the reason for this behavior is rather to be found in the linking process, where the linker stops searching the lib after it found one definition oftestfunc? - Can I somehow influence which definition of
testfuncis actually used or is this even defined? I.e., is it maybe the order of the arguments toardeciding which one is used? - Is this behavior the same for any linker/version of
aror might it be that this depends on the system?