Попытка статически связать Boost

Я работаю в 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

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

undefined ссылка на `pthread_mutex_init '

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

Ответы

Ответ 1

Для 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

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

Ответ 3

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