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

bar*_*baz 3 c macos gcc

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

gcc -dynamiclib *.o -lfoo -lbar -o outfile
Run Code Online (Sandbox Code Playgroud)

这将是

gcc -shared *.o -lfoo -lbar -o outfile
Run Code Online (Sandbox Code Playgroud)

ldLinux系统上的binutils .现在,如果我想将libfoo和libbar静态链接,我可以直接命名静态库

gcc -dynamiclib *.o /usr/lib/libfoo.a /usr/lib/libbar.a -o outfile
Run Code Online (Sandbox Code Playgroud)

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

gcc -shared *.o -l:libfoo.a -l:libbar.a -o outfile
Run Code Online (Sandbox Code Playgroud)

但是苹果ld没有.

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

小智 8

引用QA1393,

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

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