Вы можете отредактировать файл .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
, он предполагает, что вы хотите динамическую версию, и она дает только -lxcb
. Динамически разделяемый объект xcb.so
будет знать, как загружать все свои собственные зависимости, поэтому вам не нужно указывать их при привязке к нему.
Если вы запустите pkg-config --libs xcb --static
, то полями .private
вступили в игру, и вы получите -lxcb -lXau -lXdmcp
.
Я не сталкивался со многими системами сборки, которые знают, чтобы передать аргумент --static
в pkg-config
. Поэтому, если ваш файл .pc
предназначен только для поддержки статической компоновки, вероятно, лучше не использовать поля .private
и просто предоставить все зависимости, которые нужны людям безоговорочно. Таким образом, люди могут успешно связываться с библиотекой, даже если они не знают, что они статичны или не знают, чтобы пройти --static
до pkg-config
.
Это интересно. Это документированный вариант? Linker, я имею (от clang?), Похоже, не поддерживает его: «ld: библиотека не найдена для -l: libpng16.a». – Kornel
@porneL, да, это задокументировано. Я редактировал цитату из руководства. –