2011-07-17 17 views
8

Instalé boost usando macports. Los archivos parecen estar en/opt/local/include/impulso/biblioteca no encontrada para -lboost_system

Mi makefile ya no funciona y me da el siguiente error

Undefined symbols: 
"boost::system::generic_category()", referenced from: 
    __static_initialization_and_destruction_0(int, int)in client.o 
    __static_initialization_and_destruction_0(int, int)in client.o 
"boost::system::system_category()", referenced from: 
    boost::asio::error::get_system_category() in client.o 
    boost::system::error_code::error_code()in client.o 
    __static_initialization_and_destruction_0(int, int)in client.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [client] Error 1 

en la escuela la solución era utilizar -lboost_system como argumento a g ++, pero ahora que he llevado el proyecto a mi mac, esto no funciona. Creo que esto se debe principalmente al hecho de que en la escuela los archivos de refuerzo estaban en usr/local/lib (o en algún lugar similar).

cuando agrego el argumento -lboost_system me sale el siguiente mensaje de

g++ -I/opt/local/include -lboost_system -o client client.o Packet.o 
ld: library not found for -lboost_system 
collect2: ld returned 1 exit status 
make: *** [client] Error 1 

He probado algunas variaciones usando -L y -l, pero me parece que no puede encontrar una combinación que funciona. En la escuela tampoco tengo que usar -L. He leído algunas otras publicaciones aquí sobre problemas similares, pero lo arreglaron agregando -l flags que no funcionan para mí.

¡Ayuda! ¡Gracias!

Respuesta

12

Te falta -L/opt/local/lib. Usted debe ser capaz de establecer el LDFLAGS en su Makefile:

LDFLAGS=-L/opt/local/lib 

Esto supone que las bibliotecas Boost están en /opt/local/lib por supuesto.

Si usted no está utilizando los habituales CXXFLAGS y LDFLAGS variables en el Makefile, a continuación, añadir el -L/opt/local/lib directamente en su regla final:

client: client.o Packet.o 
    g++ -L/opt/local/lib -o client client.o Packet.o -lboost_system 

El -I solamente le dice al compilador dónde están los archivos de cabecera, el enlazador necesita bibliotecas y usa -L para eso.

+0

¿lo ven? Hay todos los archivos en/opt/local/lib. Esperemos que esto funcione – jim

+0

¡Funcionó! muchas gracias. Tengo mucho que aprender. – jim

+1

@jim Tiene al menos otra cosa que aprender .. Debe aceptar la respuesta si es correcta. Así es como funciona este sistema colaborativo de preguntas y respuestas. – GrafikRobot

1

Se podría tratar de buscar en su sistema como este:

/sbin/ldconfig -p | grep boost_system | cut -d\> -f2 

si se ha instalado la biblioteca, entonces debería mostrar algo como esto:

/usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0 

, o mostrará solo una línea en blanco

En su caso, parece que el impulso está instalado en otro lugar, de ahí la necesidad de información adicional del enlazador, de ahí la necesidad del interruptor -L, si usted tenerlo en/usr/lib, ya que no tengo necesidad de información adicional en el archivo MAKE

Cuestiones relacionadas