2010-02-27 43 views
14

Estoy trabajando en Linux, Eclipse CDT, g ++, con la biblioteca de Boost. Al tener un programa existente que usa el hilo Boost, trato de vincularlo estáticamente en lugar de dinámicamente./Usr/local/lib contiene los siguientes archivos:Intentando vincular estáticamente Boost

libbost_thread.a 
libbost_thread.so 
libbost_thread.1.41.0 

dinámicos obras que unen:

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

vinculación estática:

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

produce gran número de mensajes como:

referencia indefinida para `pthread_mutex_init '

¿Cómo puedo vincular estáticamente a la biblioteca de Boost?

+0

Esto es casi idéntico a su pregunta anterior http://stackoverflow.com/questions/2328439/boost-static-linking y las publicaciones duplicadas generalmente están mal vistas. –

+2

@Dirk: están relacionados, pero definitivamente son diferentes. La pregunta anterior era cómo decirle al vinculador que use el .a en lugar del .so. Esta pregunta es sobre problemas que suceden una vez que hace eso. Es mejor publicar una nueva pregunta relacionada y luego agregar nuevas preguntas a una existente. –

+0

@Samuel: Estoy corregido, y he aprendido de ti sobre la opción del enlazador '-pthread'. ¡Gracias! –

Respuesta

23

Para pthread_mutex_init, que quiere compilar/enlace con la opción -pthread:

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

El problema es que funciona como pthread_mutex_init están en una biblioteca independiente. Las bibliotecas dinámicas pueden incluir los metadatos por el hecho de que necesitan la biblioteca por separado (por lo que libboost_thread.so incluye el hecho de que necesita libpthread).

Pero las bibliotecas estáticas no tienen esa información. Por lo tanto, debe proporcionar la referencia a las bibliotecas necesarias cuando realice un enlace estático.

En cuanto a usar -pthread en lugar de -lpthread, es ligeramente preferible debido a que no sólo vincula la biblioteca necesaria, pero ofrece otras opciones que deben utilizarse (por ejemplo un -D_REENTRANT al compilador).

+2

+1 por mencionar la importante distinción entre '-lpthread' y' -pthread' –

+0

-static -pthread ¡Gracias, finalmente tuvo éxito! ¿Qué es -pthread? ¿Algo de impulso específico o opción de enlazador? Parece una magia para mí, pero necesito entender esto. También trabajo con las Opciones del programa Boost (-lboost_program_options), ¿qué interruptor debería usar para vincularlo estáticamente? –

+0

@AlexFarber: -pthread es una opción de gcc. Le dice al compilador que construya correctamente su código para enhebrar. –

2

Pruebe agregar -lpthread a su invocación.

2

En Linux, una biblioteca dinámica puede depender automáticamente de otras bibliotecas dinámicas para que, al vincularla, obtenga las otras bibliotecas de forma gratuita. Al vincular estáticamente, no existe dicho sistema y debe especificar las otras bibliotecas manualmente.

Cuestiones relacionadas