如何使用pkg-config静态链接库

时间:2014-12-21 03:34:40

标签: static-linking pkg-config

我想静态链接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”。

4 个答案:

答案 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,则会假定您需要动态版本,它只为您提供-lxcbxcb.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