2010-02-27 5 views
14

statisch zu verknüpfen Ich arbeite in Linux, Eclipse CDT, g ++, mit Boost-Bibliothek. Mit einem vorhandenen Programm, das Boost-Thread verwendet, versuche ich, es statisch statt dynamisch zu verknüpfen./Usr/local/lib-Verzeichnis enthält die folgenden Dateien:Versuchen, Boost

libbost_thread.a 
libbost_thread.so 
libbost_thread.1.41.0 

Dynamische Verknüpfung Werke:

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

Statische Verknüpfung:

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

produziert riesige Anzahl von Nachrichten wie:

undefinierter Verweis auf `pthread_mutex_init '

Wie kann ich statisch mit der Boost-Bibliothek verknüpfen?

+0

Dies ist fast identisch mit Ihrer vorherigen Frage http://StackOverflow.com/Questions/2328439/Boost-Static-Linking und doppelte Beiträge sind in der Regel verpönt. –

+2

@Dirk - sie sind verwandt, aber definitiv anders. Die vorherige Frage war, wie man den Linker anweist, statt der .so die .a zu verwenden. Diese Frage handelt von Problemen, die auftreten, wenn er das tut. Es ist besser, eine neue verwandte Frage zu stellen und dann neue Fragen an eine bestehende zu knüpfen. –

+0

@Samuel: Ich stehe korrigiert, und lernte von Ihnen über die Linke-Option "-Pthread". Vielen Dank! –

Antwort

23

Für pthread_mutex_init, möchten Sie kompilieren/link mit -pthread Option:

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

Das Problem ist, dass Funktionen wie pthread_mutex_init in einer separaten Bibliothek sind. Dynamische Bibliotheken können die Metadaten für die Tatsache enthalten, dass sie die separate Bibliothek benötigt (also beinhaltet libboost_thread.so die Tatsache, dass sie libpthread benötigt).

Aber statische Bibliotheken haben diese Information nicht. Sie müssen also den Verweis auf alle erforderlichen Bibliotheken bereitstellen, wenn Sie statisch verknüpfen.

Wie für die Verwendung von -pthread statt -lpthread, dann ist es leicht zu bevorzugen, da es nicht nur die notwendige Bibliothek verbindet, bietet aber alle anderen Optionen, die verwendet werden sollte (eine solche -D_REENTRANT an den Compiler).

+2

+1 für die Erwähnung des wichtigen Unterschieds zwischen '-lpthread' und' -pthread' –

+0

-static -thread Danke, endlich ist es gelungen! Was ist -thread? Etwas Boost-spezifische oder Linker-Option? Es sieht wie eine Magie für mich aus, aber ich muss das verstehen. Ich arbeite auch mit Boost Programmoptionen (-lboost_program_options), welchen Schalter soll ich verwenden, um es statisch zu verbinden? –

+0

@AlexFarber: -Pthread ist eine GCC-Option. Es weist den Compiler an, den Code für das Threading ordnungsgemäß zu erstellen. –

2

Versuchen Sie -lpthread zu Ihrem Aufruf hinzuzufügen.

2

Unter Linux kann eine dynamische Bibliothek automatisch von anderen dynamischen Bibliotheken abhängig sein, so dass Sie die anderen Bibliotheken bei der Verknüpfung kostenlos erhalten. Wenn Sie statisch verknüpfen, gibt es kein solches System und Sie müssen die anderen Bibliotheken manuell angeben.