我尝试使用g ++将我的可执行程序与2个静态库链接起来。 2个静态库具有相同的函数名称。我期待从链接器链接错误的“多重定义”,但我没有收到。任何人都可以帮忙解释为什么会这样吗?
#ifndef _STATIC_LIBA_HEADER
#define _STATIC_LIBA_HEADER
int hello(void);
#endif
#include "staticLibA.h"
int hello(void)
{
printf("\nI'm in staticLibA\n");
return 0;
}
输出:
g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp
ar -cvq ../libstaticLibA.a staticLibA.o
a - staticLibA.o
#ifndef _STATIC_LIBB_HEADER
#define _STATIC_LIBB_HEADER
int hello(void);
#endif
#include "staticLibB.h"
int hello(void)
{
printf("\nI'm in staticLibB\n");
return 0;
}
输出:
g++ -c -Wall -fPIC -m32 -o staticLibB.o staticLibB.cpp
ar -cvq ../libstaticLibB.a staticLibB.o
a - staticLibB.o
extern int hello(void);
int main(void)
{
hello();
return 0;
}
输出:
g++ -c -o main.o main.cpp
g++ -o multipleLibsTest main.o -L. -lstaticLibA -lstaticLibB -lstaticLibC -ldl -lpthread -lrt
答案 0 :(得分:1)
链接器不会查看staticLibB
,因为在staticLibA
被链接的时候,没有未实现的依赖项。
答案 1 :(得分:1)
这很简单。如果尚未定义引用的符号,则仅从库中拉出对象。只有一个hellos被拉(从A)。如果您与.o文件链接,则会出现错误。
答案 2 :(得分:1)
当链接器尝试将main.o
链接到multipleLibsTest
并看到hello()
未解析时,它会按照命令行上给出的顺序开始搜索库。它将在hello()
中找到staticLibA
的定义,并将终止搜索。
它根本不会查看staticLibB
或staticLibC
。
如果staticLibB.o
包含另一个不在staticLibA
中且已被拉入最终可执行文件的符号,那么您将获得hello
错误的多重定义,作为单个.o
个文件被拉出图书馆,其中两个将hello()
。在链接命令行上颠倒staticLibA
和staticLibB
的顺序会使该错误消失。