Как использовать 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.