Как использовать pkg-config для статической связи библиотеки
Я хотел бы связать libpng, найденный pkg-config статически.
pkg-config --libs --static libpng
выходы
- L / usr / local / Cellar/libpng/1.6.15 / lib-lpng16-lz
у меня есть оба libpng16.a
libpng16.dylib
в этом каталоге, и если я использую эти флаги, библиотека связывается динамически.
как я могу сказать pkg-config или компоновщику (желательно каким-то портативным способом), что я действительно хочу, чтобы он был связан статически?
Я попытался добавить -static
перед флагами pkg-config, но это делает clang ld
попробуйте не связать " crt0.о."
3 ответов
на pkg-config --static
опции полагается на правильную маркировку .ПК файлы. Если предоставление --static
опция не возвращает правильную информацию, необходимую для ссылки на архив libpng, тогда вы не можете использовать pkg-config
для этой цели.
Я подозреваю libpng
(наряду с большинством других пакетов) упала поддержка статического связывания через некоторое время после libpng 1.2
. Они все еще могут предоставить архив библиотеки, но libpng pkg-config
файл больше не помечен должным образом для поддержки статическая связь. Вам придется вручную сказать ld
использовать статический lib.
попробуй:
-L/usr/local/Cellar/libpng/1.6.15/lib -l:libpng16.a -lz
использование -l с символом a: позволяет указать расширение имени файла.
параметр-l: задокументирован в руководство GNU ld 2.24:
- l namespec
--library=namespec
добавить архив или объектный файл, указанный namespec к списку файлов для ссылки. Эта опция может использоваться любое количество раз. Если namespec имеет форму : filename, ld будет искать путь к библиотеке для файла с именем имя файла, в противном случае он будет искать путь к библиотеке для файла с именем libnamespec.а.
в системах, поддерживающих общие библиотеки, ld может также искать файлы, отличные от libnamespec.а. В частности, в системах ELF и SunOS ld будет искать каталог для библиотеки под названием libnamespec.так прежде чем искать кого называют libnamespec.а. (По Конвенции .поэтому расширение указывает общую библиотеку.) Обратите внимание, что это поведение не относится к : filename, который всегда указывает файл с названием имя файла.
редактировать .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
. The xcb.so
динамически общий объект будет знать, как загрузить все свои собственные зависимости, поэтому вам не нужно указывать их при связывании с ним.
если вы запустите pkg-config --libs xcb --static
, потом .private
поля вступают в игру, и вы получите -lxcb -lXau -lXdmcp
.
я не встречал много систем сборки, которые знают, чтобы передать до pkg-config
. Так что если ваш .pc
файл предназначен только для поддержки статической компоновки, вероятно, лучше не использовать .private
поля, и просто обеспечить всех зависимых людей, то, безусловно, нужно. Таким образом, люди могут успешно связываться с библиотекой, даже если они не знают, что она статична или не знают, чтобы передать --static
to pkg-config
.