当我 link 两个时,我可以在两个 C++ 静态库中有两个主要函数吗?
I can have two main function in two static library of C++ when I link both of them?
我有三个文件:
test.cpp(为空):
main1.cpp
int main()
{
printf("main_1\n");
return 0;
}
main2.cpp
int main()
{
printf("main_2\n");
return 0;
}
然后我创建两个静态库main1.a和main1.a.
g++ -c main1.cpp
ar main1.a main1.o
g++ -c main2.cpp
ar main2.a main2.o
我发现输出会因 main1.a 和 main2.a 的顺序而不同,因为
main1.a在main2.a
前面
$ g++ -o 输出 test.cpp main1.a main2.a
$./out
输出为"main_1"
main2.a在main1.a
前面
$ g++ -o 输出 test.cpp main2.a main1.a
$ ./out
输出为"main_2"
为什么它不会将错误消息 "multiple definition of `main'" 作为命令?:
g++ -o 输出 test.cpp main1.cpp main2.cpp
链接器处理这两种情况的方式非常不同(默认情况下)。将代码编译成目标文件并链接它们时,链接器将不允许存在两个强定义。此处的 Strong 是指具有设定值的函数或变量。它将允许一个强的和多个弱的(比如一个变量在一个对象中有一个设置值,另一个对象有相同的变量但没有设置值)。
对于静态库,链接器会按照给定的顺序遍历它们。它查找导出,如果其他链接对象需要它们中的任何一个,它会将其接收并重新启动该文件中的进程(以查找刚刚找到的函数可能需要的函数)。所以在这个过程中,当它到达第一个库时,它检查它的导出,看到 main
,确定它是需要的并接受它。然后它进入第二个库,看到 main
,没有在未定义符号列表中查看它并跳过它。
上找到更多信息
我有三个文件:
test.cpp(为空):
main1.cpp
int main()
{
printf("main_1\n");
return 0;
}
main2.cpp
int main()
{
printf("main_2\n");
return 0;
}
然后我创建两个静态库main1.a和main1.a.
g++ -c main1.cpp
ar main1.a main1.o
g++ -c main2.cpp
ar main2.a main2.o
我发现输出会因 main1.a 和 main2.a 的顺序而不同,因为
main1.a在main2.a
前面$ g++ -o 输出 test.cpp main1.a main2.a
$./out
输出为"main_1"
main2.a在main1.a
前面$ g++ -o 输出 test.cpp main2.a main1.a
$ ./out
输出为"main_2"
为什么它不会将错误消息 "multiple definition of `main'" 作为命令?:
g++ -o 输出 test.cpp main1.cpp main2.cpp
链接器处理这两种情况的方式非常不同(默认情况下)。将代码编译成目标文件并链接它们时,链接器将不允许存在两个强定义。此处的 Strong 是指具有设定值的函数或变量。它将允许一个强的和多个弱的(比如一个变量在一个对象中有一个设置值,另一个对象有相同的变量但没有设置值)。
对于静态库,链接器会按照给定的顺序遍历它们。它查找导出,如果其他链接对象需要它们中的任何一个,它会将其接收并重新启动该文件中的进程(以查找刚刚找到的函数可能需要的函数)。所以在这个过程中,当它到达第一个库时,它检查它的导出,看到 main
,确定它是需要的并接受它。然后它进入第二个库,看到 main
,没有在未定义符号列表中查看它并跳过它。