如何避免多重定义链接错误?

除了将hello()函数移动到另一个源(.cpp)文件或重命名该函数。 有没有其他的方法来避免链接错误?

staticLibA.h

 #ifndef _STATIC_LIBA_HEADER #define _STATIC_LIBA_HEADER int hello(void); int hello_staticLibA_only(void); #endif 

staticLibA.cpp

 #include "staticLibA.h" int hello(void) { printf("\nI'm in staticLibA\n"); return 0; } int hello_staticLibA_only(void) { printf("\nstaticLibA: hello_staticLibA_only\n"); return 0; } 

输出:

 g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp ar -cvq ../libstaticLibA.a staticLibA.o a - staticLibA.o 

staticLibB.h

 #ifndef _STATIC_LIBB_HEADER #define _STATIC_LIBB_HEADER int hello(void); int hello_staticLibB_only(void); #endif 

staticLibB.cpp

 #include "staticLibB.h" int hello(void) { printf("\nI'm in staticLibB\n"); return 0; } int hello_staticLibB_only(void) { printf("\nstaticLibB: hello_staticLibB_only\n"); return 0; } 

输出:

 g++ -c -Wall -fPIC -m32 -o staticLibB.o staticLibB.cpp ar -cvq ../libstaticLibB.a staticLibB.oa - staticLibB.o 

main.cpp中

 extern int hello(void); extern int hello_staticLibA_only(void); extern int hello_staticLibB_only(void); int main(void) { hello(); hello_staticLibA_only(); hello_staticLibB_only(); return 0; } 

输出:

 g++ -c -o main.o main.cpp g++ -o multipleLibsTest main.o -L. -lstaticLibA -lstaticLibB -lstaticLibC -ldl -lpthread -lrt ./libstaticLibB.a(staticLibB.o): In function `hello()': staticLibB.cpp:(.text+0x0): multiple definition of `hello()' ./libstaticLibA.a(staticLibA.o):staticLibA.cpp:(.text+0x0): first defined here collect2: ld returned 1 exit status make: *** [multipleLibsTest] Error 1 

Solutions Collecting From Web of "如何避免多重定义链接错误?"

既然你似乎拥有这两个库,目前还不清楚为什么你不能重命名该功能…

在你的main ,你有这样一行:

 hello(); 

如果连接错误消失了,你希望在这里发生什么? 是否应该在LibALibB ? 依靠将库传递给链接器来确定链接哪个函数的顺序,似乎是一个非常糟糕的主意 。 在一个真实的例子中,如果你的hello_staticLibB_only函数调用hello() ,会发生什么? 它最终可能会调用其他库中的函数的版本…

当你使用g++ ,你应该考虑把你的库函数放到一个namespace (它们被设计来帮助你避免这种命名冲突)。 这将允许您的代码和链接器告诉方法之间的区别。

按照LibA这种方法,您将拥有:

staticLibA.h

 #ifndef _STATIC_LIBA_HEADER #define _STATIC_LIBA_HEADER // Declare namespace to keep library functions together namespace LibA { int hello(void); int hello_staticLibA_only(void); } #endif 

staticLibA.cpp

 #include "staticLibA.h" #include <stdio.h> // Indicate that contained function definitions belong in the LibA namespace namespace LibA { int hello(void) { printf("\nI'm in staticLibA\n"); return 0; } int hello_staticLibA_only(void) { printf("\nstaticLibA: hello_staticLibA_only\n"); return 0; } } 

main.cpp中

 // These declarations would usually be in a header... but I've left // them here to match your sample code... // declare relevant functions to belong to the LibA namespace namespace LibA{ extern int hello(void); extern int hello_staticLibA_only(void); } // declare relevant functions from LibB (note they are not // in a namespace) extern int hello(void); extern int hello_staticLibB_only(void); int main(void) { // Explicitly call the hello from LibA LibA::hello(); // Call the other library function (also from LibA) LibA::hello_staticLibA_only(); // Call library functions from LibB (note they don't require a namespace // because I haven't updated it to have one) hello(); hello_staticLibB_only(); return 0; } 

链接错误特指hello。 这显示出来,因为这两个库提供“你好”的定义。 这里没有其他链接错误。

你可以把hello放在一个单独的库中,或者hello驻留在一个单独的库中,或者只是将可执行文件链接到一个hello对象文件中[hello.o]