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

Kor*_*nel 7 pkg-config static-linking

我想静态链接pkg-config找到的libpng.

pkg-config --libs --static libpng
Run Code Online (Sandbox Code Playgroud)

输出

-L/usr/local/Cellar/libpng/1.6.15/lib -lpng16 -lz

libpng16.a libpng16.dylib在这个目录中都有,如果我使用这些标志,库就会动态链接.

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

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

Qui*_*ert 7

尝试:

-L/usr/local/Cellar/libpng/1.6.15/lib -l:libpng16.a -lz
Run Code Online (Sandbox Code Playgroud)

使用带有:字符的-l可以指定文件扩展名.

GNU ld 2.24手册中记录了-l:选项:

-l namespec

--library = namespec

namespec指定的存档或目标文件添加到要链接的文件列表中.此选项可以使用任意次.如果namespec的格式为:filename,ld将在库路径中搜索名为filename的文件,否则它将在库路径中搜索名为libnamespec.a的文件.

在支持共享库的系统上,ld也可以搜索libnamespec.a以外的文件.具体来说,在ELF和SunOS系统,劳工处会搜索目录中一个名为库libnamespec.so寻找一个叫前libnamespec.a.(按照惯例,.so扩展名表示共享库.)请注意,此行为不适用于:filename,它始终指定名为filename的文件.

  • 那很有意思。这是一个记录在案的选项吗?我拥有的链接器(来自 clang?)似乎不支持它:“ld:未找到 -l:libpng16.a 的库”。 (2认同)

Dav*_*ica 6

pkg-config --static选项依赖于.pc文件中的正确标记。如果提供的--static选项未返回链接到libpng归档文件所需的正确信息,则您不能pkg-config用于此目的。

我怀疑libpng(以及其他大多数软件包)在一段时间后放弃了对静态链接的支持libpng 1.2。他们可能仍然提供了一个图书馆档案,但是该libpng pkg-config文件不再正确地标记为支持静态链接。您将必须手动告诉ld使用静态库。

  • 静态库的正确标记在 pc 文件中是什么样子的?这些天我经常看到“lib.pc”和“lib-static.pc”——这肯定不是“正确”的方式,不是吗? (2认同)

Dav*_*son 6

您可以编辑该.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}
Run Code Online (Sandbox Code Playgroud)

如果您运行pkg-config --libs xcb,它会假设您想要动态版本,并且它会为您提供-lxcb。动态共享对象xcb.so将知道如何加载它自己的所有依赖项,因此您在链接它时不必指定它们。

如果你跑pkg-config --libs xcb --static,那么.private场就会发挥作用,你就会得到-lxcb -lXau -lXdmcp

我还没有遇到过很多知道将--static参数传递给pkg-config. 因此,如果您的.pc文件只是为了支持静态链接,那么最好不要使用.private字段,而只是无条件地提供人们需要的所有依赖项。这样人们就可以成功链接到该库,即使他们不知道它是静态的或不知道传递--staticpkg-config.