我有三个文件:
测试.cpp(为空(:
主1.cpp
int main()
{
printf("main_1n");
return 0;
}
主2.cpp
int main()
{
printf("main_2n");
return 0;
}
然后我创建两个静态库main1.a和main1.a。
g++ -c main1.cpp
AR r main1.a main1.o
g++ -c main2.cpp
AR r main2.a main2.o
我发现输出会有所不同,具体取决于main1.a 和 main2.a的顺序
main1.a在main2.a前面
$ g++ -o out test.cppmain1.a main2.a
$ ./out
输出为"main_1">
main2.a在main1.a前面
$ g++ -o out test.cppmain2.a main1.a
$ ./out
输出为"main_2">
为什么它不会有错误消息"'main'的多重定义"作为命令?
g++ -o out test.cpp main1.cpp main2.cpp
链接器处理这两种情况的方式非常不同(默认情况下(。将代码编译为目标文件并链接它们时,链接器将不允许存在两个强定义。例如,这里的强是具有设定值的函数或变量。它将允许一个强变量和多个弱变量(例如一个变量在一个对象中具有设定值,另一个变量具有相同变量但没有设定值(。
使用静态库,链接器按给定的顺序遍历它们。它查找导出,如果其他链接对象需要其中任何一个,它会将其接收并重新启动该文件中的进程(以查找刚刚找到的函数可能需要的函数(。因此,在这个过程中,当它到达第一个库时,它会检查其导出,查看main
,确定它是需要的并接收它。然后它转到第二个库,看到main
,在未定义的符号列表中看不到它,只是跳过它。
更多信息可以在Eli Bendresky的网站上找到