2014-12-21 13 views
5

我想链接由pkg-config静态发现的libpng。如何使用pkg-config静态链接库

pkg-config --libs --static libpng 

输出

-L在/ usr /本地/库/ libpng的/ 1.6.15/lib目录-lpng16 -lz

我在该目录既libpng16.alibpng16.dylib和如果我使用这些标志,库会动态链接。

我该如何告诉pkg-config或链接器(最好以某种便携式方式),我真的希望它静态链接?

我试过在pkg-config的标志之前加入-static,但这使得clang的ld尝试并且无法链接“crt0.o”。

回答

2

pkg-config --static选项依赖于正确标注在.PC文件。如果提供--static选项没有返回链接libpng存档所需的正确信息,则不能使用pkg-config来实现该目的。

我怀疑libpng(以及大多数其他软件包)在libpng 1.2之后的某段时间内放弃了对静态链接的支持。他们仍可能提供库存档,但libpng pkg-config文件不再被正确标记以支持静态链接。你将不得不手动告诉ld使用静态库。

5

尝试:

-L/usr/local/Cellar/libpng/1.6.15/lib -l:libpng16.a -lz 

使用-l有:字符允许您指定的文件扩展名。

的-l:选项记录在GNU ld 2.24 manual

-l namespec

--library = namespec

添加指定的存档或对象文件通过namespec到要链接的文件列表。此选项可以使用任意次数。如果namespec的形式的:文件名,劳工处会搜索库路径名为文件,否则会搜索库路径名为libnamespec.a文件。

在支持共享库的系统上,ld还可以搜索除以外的文件libnamespec.a。具体来说,在ELF和SunOS系统上,ld将在搜索名为的libnamespec.a之前,在目录中搜索名为libnamespec.so的库。 (按照惯例,.so扩展名表示共享库。)请注意,此行为不适用于:文件名,该文件始终指定一个名为的文件名

+1

这很有趣。这是一个记录的选项?我有(来自clang?)的链接器似乎不支持它:“找不到-l:libpng16.a的ld:library”。 – Kornel

+0

@porneL,是的,它被记录。我在手册中引用了一段引文。 –

1

您可以编辑.pc文件以使其支持静态链接,特别是如果您有能力自己编译,修补和安装软件,而不是依赖某些Linux发行版。

以下是一个支持动态链接和静态链接的.pc文件示例。这是从/usr/lib/x86_64-linux-gnu/pkgconfig/xcb.pc了我的Ubuntu系统上:

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字段,只提供人们无条件需要的所有依赖关系。这样,即使人们不知道它是静态的,或者不知道通过--staticpkg-config,人们也可以成功地链接到图书馆。