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 ++中。