2014-12-21 1 views
5

Я хотел бы связать libpng, найденный pkg-config статически.Как использовать pkg-config для связывания библиотеки статически

pkg-config --libs --static libpng 

выходы

-L/USR/местные/Подвал/Libpng/1.6.15/Библиотека -lpng16 -lz

У меня есть и libpng16.alibpng16.dylib в этой директории, и если я использую эти флаги, библиотека динамически связывается.

Как я могу указать либо pkg-config, либо компоновщик (желательно каким-то портативным способом), что я действительно хочу, чтобы он был связан статически?

Я пытался добавить -static перед флагами pkg-config, но это делает clang's ld попыткой и не связывает «crt0.o».

ответ

2

pkg-config --static вариант опирается на соответствующую мечения в .pc файлов. Если предоставление опции --static не возвращает правильную информацию, необходимую для связи с архивом libpng, то для этой цели вы не можете использовать pkg-config.

Я подозреваю, что libpng (наряду с большинством других пакетов) потерял поддержку для статического соединения через некоторое время после libpng 1.2. Они все равно могут предоставить библиотечный архив, но файл libpng pkg-config больше не помечен для поддержки статической ссылки. Вам придется вручную указать ld, чтобы использовать статическую библиотеку lib.

5

Try:

-L/usr/local/Cellar/libpng/1.6.15/lib -l:libpng16.a -lz 

Используя -l с: символ позволяет указать расширение имени файла.

Параметр -l: опция описана в GNU ld 2.24 manual:

-l namespec

--library = namespec

Добавить архивный файл или объект, указанный по namespec в список файлов для ссылки. Эта опция может использоваться любое количество раз. Если namespec имеет вид : имя файла, л.д. будет искать путь к библиотеке для файла с именем файла , в противном случае он будет искать пути к библиотеке для файла с именем libnamespec.a.

В системах, поддерживающих общие библиотеки, ld также может искать файлы, отличные от libnamespec.a. В частности, в системах ELF и SunOS ld будет искать каталог для библиотеки с именем libnamespec.so перед поиском одного из них: libnamespec.a. (По соглашению расширение .so указывает на общую библиотеку.) Обратите внимание, что это поведение не относится к : filename, который всегда указывает файл с именем filename.

+1

Это интересно. Это документированный вариант? Linker, я имею (от clang?), Похоже, не поддерживает его: «ld: библиотека не найдена для -l: libpng16.a». – Kornel

+0

@porneL, да, это задокументировано. Я редактировал цитату из руководства. –

1

Вы можете отредактировать файл .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.