我有两个文件37064544_p1.cpp
& 37064544_p2.cpp
具有与以下相同的内容:
int add(int x,int y)
{
return x+y;
}
我使用
编译它们g++ -c 37064544_p2.cpp -o 37064544_p2.o
g++ -c 37064544_p2.cpp -o 37064544_p2.o
并使用
将它们添加到存档中ar -rsc lib37064544pf.a 37064544_p1.o 37064544_p2.o
并且
$ nm -s lib37064544pf.a
给了我:
Archive index:
_Z3addii in 37064544_p1.o
_Z3addii in 37064544_p2.o
37064544_p1.o:
0000000000000000 T _Z3addii
37064544_p2.o:
0000000000000000 T _Z3addii
和
$ ar -t lib37064544pf.a
给了我
37064544_p1.o
37064544_p2.o
我有一个调用{/ 1}}函数的驱动程序,该函数是用
编译的_Z3addii
结果是
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. -l37064544pf
问题
符号Sum : 11
如何解决?
_Z3addii
填充存档的顺序?如何更改此订单?
ar
出现重复符号?编译器: g ++ 4.6.3
答案 0 :(得分:2)
符号_Z3addii是如何解决的?
实施可以随意做任何事情,你违反了one definition rule。
实际上它会在第一场比赛后停止寻找任何给定的符号,这可能跟随文件被插入档案的顺序。
如何更改此订单?
使用ar
,您可以使用a
(后)和b
(之前)修饰符在插入目标文件时将其置于存档中,您仍然违反了ODR虽然。
如何防止ar出现重复符号?
据我所知,ar
相对愚蠢且有充分的理由因为某些语言允许使用相同的符号,这就是为什么在链接时没有任何错误的原因使用存档(ODR违规无需诊断)。
您可以强制ld
阅读整个档案
g++ -static 37064544driver.cpp -o 37064544driver.elf -L. \
-Wl,--whole-archive -l37064544pf -Wl,--no-whole-archive
或者您可以使用部分链接而不是传统存档,如果存在任何重复项,则会出现错误
ld -r -o lib37064544pf.a 37064544_p1.o 37064544_p2.o