Попытка статически связать 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 динамическая библиотека может автоматически зависеть от других динамических библиотек, поэтому при ее подключении вы получаете другие библиотеки бесплатно. При связывании статически нет такой системы, и вы должны указать другие библиотеки вручную.