我想静态链接pkg-config找到的libpng。
pkg-config --libs --static libpng
输出
-L / usr / local / Cellar / libpng / 1.6.15 / lib -lpng16 -lz
我在该目录中同时拥有libpng16.a
libpng16.dylib
,如果我使用这些标记,则库会动态链接。
我怎么能告诉pkg-config或链接器(最好是以某种便携式方式)我真的希望它静态链接?
我尝试在pkg-config的标志之前添加-static
,但是这使得clang的ld
尝试并且无法链接“crt0.o”。
答案 0 :(得分:5)
尝试:
-L/usr/local/Cellar/libpng/1.6.15/lib -l:libpng16.a -lz
使用带有:字符的-l可以指定文件扩展名。
-{:选项记录在GNU ld 2.24 manual:
中-l <em> namespec
- 库= namespec
将 namespec 指定的存档或目标文件添加到要链接的文件列表中。此选项可以使用任意次。如果 namespec 的格式为:filename ,则ld将在库路径中搜索名为 filename 的文件,否则将搜索库路径一个名为 libnamespec.a 的文件。
在支持共享库的系统上,ld也可以搜索 libnamespec.a 以外的文件。具体来说,在ELF和SunOS系统上,ld将在搜索名为 libnamespec.so 的库之前搜索目录,然后再搜索名为 libnamespec.a 的库。 (按照惯例,.so扩展名表示共享库。)请注意,此行为不适用于:filename ,它始终指定名为 filename 的文件。
答案 1 :(得分:4)
pkg-config --static
选项依赖于.pc文件中的正确标记。如果提供--static
选项不会返回链接libpng存档所需的正确信息,那么您不能将pkg-config
用于此目的。
我怀疑libpng
(以及大多数其他软件包)在libpng 1.2
之后的一段时间内放弃了对静态链接的支持。他们可能仍然提供库存档,但不再正确标记libpng pkg-config
文件以支持静态链接。您必须手动告诉ld
使用静态库。
答案 2 :(得分:2)
您可以编辑.pc
文件以使其支持静态链接,尤其是如果您可以自己编译,修补和安装软件而不是依赖某些Linux发行版。
以下是支持动态和静态链接的.pc
文件示例。这取自我的Ubuntu系统上的/usr/lib/x86_64-linux-gnu/pkgconfig/xcb.pc
:
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include
xcbproto_version=1.11
Name: XCB
Description: X-protocol C Binding
Version: 1.11.1
Requires.private: pthread-stubs xau >= 0.99.2 xdmcp
Libs: -L${libdir} -lxcb
Libs.private:
Cflags: -I${includedir}
如果您运行pkg-config --libs xcb
,则会假定您需要动态版本,它只为您提供-lxcb
。 xcb.so
动态共享对象将知道如何加载它自己的所有依赖项,因此在链接它时不必指定它们。
如果您运行pkg-config --libs xcb --static
,则.private
字段开始播放,您获得-lxcb -lXau -lXdmcp
。
我没有遇到过许多知道将--static
参数传递给pkg-config
的构建系统。因此,如果您的.pc
文件仅用于支持静态链接,则最好不要使用.private
字段,并且只提供人们无条件需要的所有依赖项。这样人们就可以成功地链接到图书馆,即使他们不知道它是静态的,或者不知道将--static
传递给pkg-config
。
答案 3 :(得分:0)
只需在上述@David Garyson的帖子中添加,我想添加。如果是特定
*。pc文件无法使用以下命令 pkg-config --libs
然后您可能需要将变量添加到PATH
Perhaps you should add the directory containing `nice.pc' to the PKG_CONFIG_PATH environment variable