如果静态库(.a)包含重复的目标文件(.o)会发生什么?

时间:2014-08-03 10:02:23

标签: ios xcode macos linker

AFAIK,旧版本的Xcode如果多次链接,则无法链接静态库。我认为存在一种重复的对象文件或符号问题。

最近,我意识到Xcode5不再在静态库的重复链接上报告相关错误。这是我的考试。


  • 我写了3个Objective-C类在分离的项目中命名为s1, s2, s3
  • 每个都编译为s1.o, s2.o, s3.o
  • 最后归档到s1.a, s2.a, s3.a
  • s2s1关联(合并),s3s2s1关联(合并)。

最后我收到了这些.a个文件。

Eonil$ ar -tv libs1.a  
rw-r--r--     501/20           64 Aug  3 18:38 2014 __.SYMDEF SORTED
rw-r--r--     501/20         5528 Aug  3 18:38 2014 s1.o

Eonil$ ar -tv libs2.a  
rw-r--r--     501/20          120 Aug  3 18:38 2014 __.SYMDEF SORTED
rw-r--r--     501/20         5872 Aug  3 18:38 2014 s2.o
rw-r--r--     501/20         5528 Aug  3 18:38 2014 s1.o

Eonil$ ar -tv libs3.a  
rw-r--r--     501/20          224 Aug  3 18:38 2014 __.SYMDEF
rw-r--r--     501/20         5872 Aug  3 18:38 2014 s3.o
rw-r--r--     501/20         5528 Aug  3 18:38 2014 s1.o
rw-r--r--     501/20         5872 Aug  3 18:38 2014 s2.o
rw-r--r--     501/20         5528 Aug  3 18:38 2014 s1.o

那些名称相同的.o文件都是重复的。

我编写了一个p1项目,它是一个命令行可执行文件,并将其与所有s1.a, s2.a, s3.a相关联。我预计会出现一些重复错误,但它只是构建并运行良好!


Xcode中发生了哪些重复的静态库链接?

1 个答案:

答案 0 :(得分:3)

确定;链接器在第一个库中找到符号后停止查找符号。

如果您使用-all_load选项,则会失败:

$ clang -all_load -o prog main.o -L. -lone -ltwo -lthree
duplicate symbol _func in:
    ./libone.a(file.o)
    ./libtwo.a(file.o)
duplicate symbol _func in:
    ./libone.a(file.o)
    ./libthree.a(file.o)
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是使用C测试的,而不是重要的:

$ cat main.c
extern void func();

int main(int argc, const char **argv)
{
    func();
    return 0;
}

$ cat file.c
#include <stdio.h>

void func()
{
    printf("func()\n");
}