2009-08-20 17 views
5

Estoy aprendiendo sobre Boost y tengo problemas con mis marcas de archivos. Aquí es mi makefile básica:Incluyendo bibliotecas de impulso en los archivos de make

accesstimer: acctime.o btimer.o 
    g++ acctime.o btimer.o -o accesstimer 

acctime.o: acctime.cpp btimer.h 
    g++ -c acctime.cpp 

bentimer.o: btimer.cpp btimer.h 
    g++ -c btimer.cpp 

Cuando acctime.cpp no ​​tiene elementos impulso del sistema de archivos en esta m, archivo Ake funciona bien. Tan pronto como agregue los elementos del sistema de archivos de impulso, obviamente necesito hacer referencias a la biblioteca de impulso en el archivo make, aquí es donde tengo problemas.

La siguiente línea trabaja para una sola compilación de archivos:

g++ -I /usr/local/boost/boost_1_39_0 boosttest1.cpp -o bt1 /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a 

Ahora estoy tratando de integrar este principio en el archivo make. He probado muchos basados ​​en la información que puedo encontrar en la web pero ninguno estamos trabajando esta es mi última:

accesstimer: acctime.o bentimer.o 
    g++ acctime.o bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c -I /usr/local/boost/boost_1_39_0 acctime.cpp /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Por desgracia, stlill no puede encontrar las bibliotecas Boost, ¿alguien puede ayudar? gracias

de haber leído los consejos de las personas que han contestado ahora tengo esto:

accesstimer: acctime.o bentimer.o 
    g++ -L /usr/local/boost/boost_1_39_0 acctime.o /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Pero esto todavía no se puede vincular.

Este es el mensaje de error que estoy recibiendo: (gracias muy apreciada)

g++ -L /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 
acctime.o: In function boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)': 
acctime.cpp:(.text._ZN5boost10filesystem6existsINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEbE4typeERKS7_[boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)]+0x26): undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)' 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

consejos Después de orsogufo ahora tienen esto:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Mirando mejor, pero todavía puede no del todo encuentre la biblioteca:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt.a 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

He comprobado la ubicación y la biblioteca está definitivamente en: /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a

aún ninguna alegría, usimg esto ahora:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0 -lboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h 
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Conseguir:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib/ -llibboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer 
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

Es trabajar con esto:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h 
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Gracias por toda su ayuda

+0

Podría por favor puesto el mensaje de error que está recibiendo? –

+0

Cuando vincula bibliotecas con el distintivo -l, siempre deja de lado la "lib" inicial. Así que vincular libm.a es -lm, libboost es -lboost, etc. –

Respuesta

9

EDITADO
Al vincular los archivos de objetos para crear el archivo ejecutable (su primera regla makefile) debe pasar la ubicación de las bibliotecas Boost con la bandera -L y los nombres de las bibliotecas con la bandera -l .

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer 

donde /usr/local/boost/boost_1_39_0/stage/lib es el directorio que contiene las bibliotecas y boost_filesystem el nombre de archivo de la biblioteca sin el principio lib (modificar esos dos según el caso).

OTRA EDICIÓN El archivo .a que está intentando vincular es incorrecto ... la biblioteca no debería tener extensión.

2

Debe agregar las bibliotecas de impulso a la fase de enlace (la línea de destino de acceso) y no a la fase de compilación (donde solo se necesita la ruta de inclusión).

0

Hola Siguiente es el procedimiento completo para agregar impulso a cmake/make file. Esta respuesta está especialmente desarrollada para el programador principiante en cpp.

Si desea agregar la compatibilidad de la biblioteca de impulso con la ayuda de Makefile, debe especificar la ruta de la biblioteca (con la opción -L) y las bibliotecas (con la opción -l).

-L ruta/a/los/las bibliotecas llibrary -l

** Ahora cómo encontrar camino a las bibliotecas **

siguiente es el truco:

  1. terminal abierto y comando de disparo

    $ localizar impulso> libboost.txt

    $ gedit libboost.txt

  2. Este comando abre un archivo de texto que contiene todas las rutas de bibliotecas impulso.

  3. Ahora encuentre ("ctr + F") libboost, que resalta los archivos de biblioteca de impulso con la extensión .a y .so en este archivo de texto.

  4. Copie la ruta en la que está presente .so archivos.

    por ejemplo: Si el archivo .so presente como en /usr/lib/x86_64-linux-gnu/libboost_filesystem.so

    continuación, especificar la ruta como: -L/usr/lib/x86_64-linux- GNU/

Ahora ¿Cómo encontrar respectiva biblioteca?

  1. Esto depende de lo impulso funcionalidades/módulos está utilizando

    por ejemplo: Si está utilizando impulso roscado, va a requerir siguientes bibliotecas

    libboost_filesystem.so

    libboost_thread.por lo

    libboost_system.so

  2. Añadir por encima de las bibliotecas de la siguiente manera con la opción -l:

    lboost_filesystem -l

    lboost_thread -l

    - l lboost_system

Esperamos que esto le ayuda, aún más si hay manera más fácil, por favor, sugieren

Cuestiones relacionadas