Попытка статически связать Boost - PullRequest
14 голосов
/ 27 февраля 2010

Я работаю в Linux, Eclipse CDT, g ++, с библиотекой Boost. Имея существующую программу, которая использует Boost-поток, я пытаюсь связать ее статически, а не динамически Каталог / usr / local / lib содержит следующие файлы:

libbost_thread.a
libbost_thread.so
libbost_thread.1.41.0

Динамическое связывание работает:

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

Статическое связывание:

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

производит огромное количество сообщений, таких как:

неопределенная ссылка на `pthread_mutex_init '

Как мне статически связать библиотеку Boost?

Ответы [ 3 ]

24 голосов
/ 27 февраля 2010

Для pthread_mutex_init вы хотите скомпилировать / связать с опцией -pthread:

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

Проблема в том, что такие функции, как pthread_mutex_init, находятся в отдельной библиотеке. Динамические библиотеки могут включать метаданные для факта, что ему нужна отдельная библиотека (поэтому libboost_thread.so включает в себя тот факт, что ей нужен libpthread).

Но статические библиотеки не имеют этой информации. Поэтому вам нужно предоставить ссылку на все необходимые библиотеки, когда вы создаете статическую ссылку.

Что касается использования -pthread вместо -lpthread, это несколько предпочтительнее, поскольку он не только связывает необходимую библиотеку, но и предоставляет любые другие опции, которые следует использовать (например, -D_REENTRANT для компилятора).

2 голосов
/ 27 февраля 2010

В Linux динамическая библиотека может автоматически зависеть от других динамических библиотек, поэтому, когда вы связываете ее, вы получаете другие библиотеки бесплатно. При статическом связывании такой системы нет, и вам нужно указать другие библиотеки вручную.

2 голосов
/ 27 февраля 2010

Попробуйте добавить -lpthread к вашему вызову.

...