外部符号是如何解决的?

时间:2016-05-06 06:29:15

标签: c++ g++ static-linking ar nm

我有两个文件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

问题

  1. 符号Sum : 11 如何解决?

    • 是否符合档案索引?
    • 是否按照我们使用_Z3addii填充存档的顺序?
  2. 如何更改此订单?

  3. 如何阻止ar出现重复符号?
  4. 编译器: g ++ 4.6.3

1 个答案:

答案 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