Mac OS上的混合静态和动态链接

时间:2011-01-01 23:10:44

标签: c macos gcc

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

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

将是

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

on 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没有。

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

2 个答案:

答案 0 :(得分:8)

引用QA1393

  

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

根据QA1393的建议,您可以将静态库放在不同的目录中,在-L/path/to/static/libraries出现可能指向动态库的-L之前使用-search_paths_first,然后使用{{1}}链接器在搜索下一个搜索路径之前尝试.dylib(不会在那里)和.a在第一个搜索路径中等等。

答案 1 :(得分:3)

我遇到了同样的问题。事实证明,如果没有指定.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'前缀的dependeance视为文件 - 而是作为库。使用上面的vpath magic make查找库并将命令行上的完整路径放到g ++中。