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".
尝试:
-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的文件.
该pkg-config --static
选项依赖于.pc文件中的正确标记。如果提供的--static
选项未返回链接到libpng归档文件所需的正确信息,则您不能pkg-config
用于此目的。
我怀疑libpng
(以及其他大多数软件包)在一段时间后放弃了对静态链接的支持libpng 1.2
。他们可能仍然提供了一个图书馆档案,但是该libpng pkg-config
文件不再正确地标记为支持静态链接。您将必须手动告诉ld
使用静态库。
您可以编辑该.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
字段,而只是无条件地提供人们需要的所有依赖项。这样人们就可以成功链接到该库,即使他们不知道它是静态的或不知道传递--static
给pkg-config
.