【问题标题】:I can have two main function in two static library of C++ when I link both of them?当我链接两个静态库时,我可以在 C++ 的两个静态库中有两个主要函数吗?
【发布时间】:2020-03-26 17:53:27
【问题描述】:

我有三个文件:

test.cpp(它是空的):


main1.cpp

int main()
{
    printf("main_1\n");
    return 0;
}

main2.cpp

int main()
{
    printf("main_2\n");
    return 0;
}

然后我创建两个静态库 ma​​in1.ama​​in1.a

g++ -c main1.cpp

ar r main1.a main1.o

g++ -c main2.cpp

ar r main2.a main2.o

我发现输出会有所不同取决于 ma​​in1.ama​​in2.a 作为

  • ma​​in1.ama​​in2.a

    前面

    $ g++ -o out test.cpp ma​​in1.a main2.a

    $ ./out

    输出是“main_1”

  • ma​​in2.ama​​in1.a

    前面

    $ g++ -o out test.cpp ma​​in2.a main1.a

    $ ./out

    输出是“main_2”

为什么它不会有错误信息“multiple definition of `main'”作为命令?:

g++ -o out test.cpp main1.cpp main2.cpp

【问题讨论】:

  • @SamiKuhmonen,感谢您的回复。那么这是否意味着错误消息是在编译阶段生成的?
  • 不,它发生在链接阶段。链接器只是对目标文件和静态库使用不同的规则。第一个是“包含所有”,第二个是“包含你在目标文件中找不到的内容并获取第一个匹配的”

标签: c++ linker main


【解决方案1】:

链接器处理这两种情况的方式非常不同(默认情况下)。将代码编译成目标文件并链接它们时,链接器将不允许存在两个强定义。这里的强例如是具有设定值的函数或变量。它将允许一个强变量和多个弱变量(例如一个变量在一个对象中具有设定值,而另一个变量具有相同的变量但没有设定值)。

对于静态库,链接器会按照给定的顺序遍历它们。它查找导出,如果其他链接对象需要它们中的任何一个,它会重新启动该文件中的进程(以查找刚刚找到的函数可能需要的函数)。所以在这个过程中,当它到达第一个库时,它会检查它的导出,看到main,确定它是需要的,然后把它放进去。然后它去第二个库,看到main,在未定义符号的列表并跳过它。

更多信息请访问Eli Bendresky’s website

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多