Domanda

sto lavorando in Linux, Eclipse CDT, g ++, con libreria Boost. Avendo programma che utilizza filo Boost esistente, provo a collegarlo staticamente invece di dinamicamente. / Usr / local / lib contiene i seguenti file:

libbost_thread.a
libbost_thread.so
libbost_thread.1.41.0

opere collegamento dinamico:

g++  -o"MyProgram"  ./main.o   -lboost_thread

linking statico:

g++ -static -o"MyProgram"  ./main.o   -lboost_thread

produce numero enorme di messaggi come:

  

undefined reference to `pthread_mutex_init '

Come faccio a collegare in modo statico alla libreria Boost?

È stato utile?

Soluzione

Per pthread_mutex_init, si vuole compilare / collegamento con l'opzione -pthread:

g++ -static -pthread -o"MyProgram"  ./main.o   -lboost_thread

Il problema è che funzioni come pthread_mutex_init sono in una libreria separata. librerie dinamiche possono includere i metadati per il fatto che ha bisogno della libreria separata (in modo include libboost_thread.so il fatto che ha bisogno libpthread).

Ma le librerie statiche non hanno quelle informazioni. Quindi è necessario fornire il riferimento ad eventuali librerie necessarie quando si collega in modo statico.

Come per l'utilizzo -pthread invece di -lpthread, è leggermente preferibile in quanto non solo collega la libreria necessaria, ma fornisce tutte le altre opzioni che dovrebbero essere usati (tale -D_REENTRANT al compilatore).

Altri suggerimenti

Prova ad aggiungere al vostro -lpthread invocazione.

In Linux una libreria dinamica può dipendere automaticamente su altre librerie dinamiche in modo che quando si collega, si ottiene le altre librerie gratuitamente. Quando si collegano in modo statico, non c'è tale sistema e si deve precisare le altre librerie manualmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top