我想使用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
没有。
ld
自己查找静态库?-static
开关生成需要libfoo和libbar的目标文件中的中间输出文件,并将该文件与剩余的对象文件链接在一起以创建动态对象?答案 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 ++中。