【问题标题】:What happen if a static library (.a) contains duplicated object files (.o)?如果静态库 (.a) 包含重复的目标文件 (.o) 会怎样?
【发布时间】:2014-08-03 10:02:23
【问题描述】:

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 中发生了什么?

【问题讨论】:

    标签: ios xcode macos linker


    【解决方案1】:

    已确认;一旦在第一个库中找到符号,链接器就会停止寻找符号。

    如果你使用-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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2023-03-21
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多