【问题标题】:Mixed static and dynamic link on Mac OSMac OS 上的混合静态和动态链接
【发布时间】:2011-01-01 23:10:44
【问题描述】:

我想使用 gcc 生成一个共享库,但我想静态链接它依赖的一些其他库。现在生成我使用的“标准”动态链接输出文件

gcc -dynamiclib *.o -lfoo -lbar -o outfile

应该是

gcc -shared *.o -lfoo -lbar -o outfile

在 linux 系统上为 binutils ld 启用。现在如果我想静态链接 libfoo 和 libbar,我可以直接命名静态库

gcc -dynamiclib *.o /usr/lib/libfoo.a /usr/lib/libbar.a -o outfile

但是,这样我必须自己查找库文件。 GNU binutils ld 支持这个:

gcc -shared *.o -l:libfoo.a -l:libbar.a -o outfile

但苹果的ld 没有。

  • 有没有办法让苹果的ld 自己寻找静态库?
  • 如果没有,是否有其他方法可以避免命名档案的确切位置,例如使用 -static 开关从需要 libfoo 和 libbar 的目标文件中生成中间输出文件,并将该文件与剩余的目标文件链接在一起以创建动态对象?

【问题讨论】:

    标签: c macos gcc


    【解决方案1】:

    引用QA1393

    通常,链接器一次一个地遍历搜索路径中的每个路径以查找库的动态版本。如果没有找到,它会遍历这些路径中的每一个,寻找同一库的静态版本。如果两个库位于同一目录中而不使用 -l 链接器选项和每个库的绝对路径,则无法在相应的 dylib 上选择静态库。

    按照 QA1393 的建议,您可以将静态库放在不同的目录中,在可能指向动态库的其他 -L 出现之前使用 -L/path/to/static/libraries-search_paths_first,以便链接器同时尝试 .dylib (不存在)和 .a 在第一个搜索路径中,然后再搜索下一个搜索路径,依此类推。

    【讨论】:

    • 恐怕这根本不能解决问题......我要的是 -l 分辨率的舒适度 - 如果我想将库放在某个地方或添加他们的路径,我也可以直接命名存档文件。
    • 如果搜索路径中没有 .dylib,链接器将使用 .a。但是,如果有可用的动态版本,则无法阻止链接器使用它。如果是这样,恐怕你的问题没有解决办法。
    【解决方案2】:

    我遇到了同样的问题。事实证明,如果不指定 .a 文件的完整路径,似乎无法静态链接库。

    但是,Makefile 中似乎有neat trick 允许流畅使用。

    vpath %.a /opt/local/lib
    .LIBPATTERNS lib%.a lib%.dylib lib%.so
    
    STATICLIBS = -lssh2
    
    libmy.dylib: my1.o my2.o $(STATICLIBS)
      g++ -dynamiclib -o libmy.dylib $^
    

    注意$(STATICLIBS) 变量是如何放入依赖项中的。 Make 不会将带有“-l”前缀的依赖项视为文件,而是将其视为库。使用上面的vpathmagic make 查找库并将完整路径放在命令行上到 g++。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      相关资源
      最近更新 更多