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

我想使用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自己寻找静态库?
  • 如果没有,是否有另一种方法可以避免命名存档的确切位置,例如从需要libfoo的目标文件和带有-static开关的libbar生成中间输出文件,并将该文件与剩余的对象文件链接在一起以创建动态对象?

引用QA1393 ,

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

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

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

但是, Makefile似乎有一个巧妙的技巧 ,可以顺利使用。

 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’前缀的dependecies视为文件 – 而是作为库。 使用上面的vpath magic make查找库并将命令行上的完整路径放到g ++中。