当我链接两个静态C++库时,我可以在两个主函数库中有两个主要功能吗?



我有三个文件:

测试.cpp(为空(:


主1.cpp

int main()
{
printf("main_1n");
return 0;
}

主2.cpp

int main()
{
printf("main_2n");
return 0;
}

然后我创建两个静态库main1.amain1.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.amain2.a前面

    $ g++ -o out test.cppmain1.a main2.a

    $ ./out

    输出为"main_1">

  • main2.amain1.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的网站上找到

最新更新