AFAIK,旧版本的Xcode如果多次链接,则无法链接静态库。我认为存在一种重复的对象文件或符号问题。
最近,我意识到Xcode5不再在静态库的重复链接上报告相关错误。这是我的考试。
s1, s2, s3
。 s1.o, s2.o, s3.o
,s1.a, s2.a, s3.a
。 s2
与s1
关联(合并),s3
与s2
和s1
关联(合并)。 最后我收到了这些.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中发生了哪些重复的静态库链接?
答案 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");
}