2014-12-21 15 views
5

Mi piacerebbe collegare staticamente libpng trovato da pkg-config.Come usare pkg-config per collegare staticamente una libreria

pkg-config --libs --static libpng 

uscite

-L/usr/local/Cantina/libpng/1.6.15/lib -lpng16 -lz

ho sia libpng16.alibpng16.dylib in quella directory, e se uso questi flag la libreria viene collegata dinamicamente.

Come posso dire pkg-config o il linker (preferibilmente in un modo portable-ish) che lo voglio davvero collegato staticamente?

Ho provato ad aggiungere -static prima dei flag di pkg-config, ma quello fa clang's ld provare e non riuscire a collegare "crt0.o".

risposta

2

L'opzione pkg-config --staticsi basa su una corretta codifica nei file .pc. Se l'opzione --static non restituisce le informazioni corrette necessarie per il collegamento all'archivio libpng, non è possibile utilizzare pkg-config a tale scopo.

Sospetto che libpng (insieme alla maggior parte degli altri pacchetti) abbia abbandonato il supporto per il collegamento statico qualche tempo dopo libpng 1.2. Possono ancora fornire un archivio di libreria, ma il file libpng pkg-config non è più codificato correttamente per supportare un collegamento statico. Dovrai dire manualmente a ld di usare la lib statica.

5

Prova:

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

Utilizzando -l con un: carattere consente di specificare l'estensione del file.

L'-l: opzione è documentato nel GNU ld 2.24 manual:

-l namespec

--library = namespec

Aggiungere il file di archivio o oggetto specificato da namespec all'elenco dei file da collegare. Questa opzione può essere utilizzata qualsiasi numero di volte. Se namespec è della forma : filename, ld cercherà il percorso della libreria di un file chiamato filename , altrimenti si cercherà il percorso della libreria di un file chiamato libnamespec.a.

Sui sistemi che supportano le librerie condivise, ld può anche cercare file diversi da libnamespec.a. In particolare, sui sistemi ELF e SunOS, ld cercherà una directory per una libreria denominata libnamespec.so prima di cercarne uno chiamato libnamespec.a. (Per convenzione, un'estensione .so indica una libreria condivisa.) Si noti che questo comportamento non si applica a : nomefile, che specifica sempre un file denominato nome file.

+1

È interessante. È un'opzione documentata? Linker I have (from clang?) Non sembra supportarlo: "ld: library not found for -l: libpng16.a". – Kornel

+0

@porneL, sì, è documentato. Ho modificato in una citazione dal manuale. –

1

È possibile modificare il file .pc per supportare il collegamento statico, soprattutto se si è in grado di compilare, applicare patch e installare il software da soli anziché affidarsi a una distribuzione Linux.

Questo è un esempio di file .pc che supporta sia il collegamento dinamico che statico. Questo è preso dal /usr/lib/x86_64-linux-gnu/pkgconfig/xcb.pc sul mio sistema 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} 

Se si esegue pkg-config --libs xcb, si presuppone che si desidera che la versione dinamica e ti dà solo -lxcb. L'oggetto dinamicamente condiviso xcb.so saprà come caricare tutte le sue dipendenze in modo da non doverle specificare durante il collegamento con esso.

Se si esegue pkg-config --libs xcb --static, i campi .private entrano in gioco e si ottiene -lxcb -lXau -lXdmcp.

Non ho incontrato molti sistemi di compilazione che sanno passare l'argomento --static a pkg-config. Pertanto, se il tuo file .pc è destinato esclusivamente al collegamento statico, è probabilmente preferibile non utilizzare i campi .private e fornire solo tutte le dipendenze che le persone avranno bisogno incondizionatamente. In questo modo le persone possono collegarsi alla libreria con successo anche se non sanno che è statico o non sanno passare lo --static a pkg-config.