2012-04-03 21 views
13

Quiero usar cmake para generar mis archivos de compilación para un proyecto C++. Tengo un Makefile existente. Tengo problemas para generar este Makefile usando la sintaxis estándar cmake.Creando el archivo CMakeLists desde Makefile existente

¿Cómo incluyo bibliotecas estándar de C++ como -lstdc++ -lpthread -lboost_thread-mt en la sección TARGET_LINK_LIBRARIES de cmake? O deberían estos archivos estar incluidos en la sección ADD_DEPENDENCIES.

(O) ¿Existe una herramienta simple que genera un archivo desde un CMakeList.txtMakefile

Respuesta

9

Desafortunadamente, no hay una sencilla conversión 1: 1 de Makefile a CMakeLists. Como se supone que CMake se ejecuta en todas las plataformas, no puede basarse en suposiciones específicas de la plataforma, como GNU make does, lo que complica las cosas en ciertos lugares.

En particular, CMake ofrece un mecanismo muy poderoso y bastante complejo para usar bibliotecas: Usted llama al find_package con el nombre de su biblioteca, que invocará un script de búsqueda de biblioteca desde la ruta del módulo cmake. Este script (que también está escrito en CMake) intentará detectar la ubicación del encabezado y los archivos lib de la biblioteca y almacenarlos en un par de variables de CMake que luego se pueden pasar a los comandos de CMake, como include_directories y target_link_libraries.

Existen dos problemas con este enfoque: Primero, necesita un script de búsqueda. Afortunadamente, CMake incluye scripts de búsqueda para Pthreads, Boost y un par de otros, pero si está utilizando una biblioteca más exótica, es posible que tenga que escribir el script de búsqueda usted mismo, que es una especie de experiencia arcana al principio ...

El segundo gran problema es que no existe una forma estándar para que un script de búsqueda devuelva sus resultados. Si bien hay convenciones de denominación para las variables utilizadas, a menudo no se aplican. En la práctica, eso significa que tendrá que consultar la fuente de un script de búsqueda para saber cómo usarlo. Afortunadamente, los scripts que vienen con CMake están en su mayoría muy bien documentados.

Los scripts integrados se encuentran en algún lugar como <cmake-install-prefix>/share/cmake-2.8/Modules. Para su pregunta, mire los archivos FindBoost.cmake y FindThreads.cmake (CMake debe vincular automáticamente con la biblioteca estándar). Anycorn ya dio algunos ejemplos de código para usar el script de Boost, todo lo demás que necesita saber está en la documentación de CMake o directamente en los archivos de script de búsqueda.

2

De esta manera:

target_link_libraries(your-target-name pthread boost_thread-mt etc) 

No use add_dependencies cuando se quiere vincular bibliotecas. La vinculación implica una dependencia, pero la dependencia por sí sola no será suficiente cuando necesite vincularse.

2

Con Boost que realmente necesita para utilizar el buscador paquete

set(Boost_ADDITIONAL_VERSIONS "1.46" "1.46.0" "1.46.1") 
    set(Boost_USE_MULTITHREADED ON) # for -mt 
    find_package(Boost COMPONENTS thread) 
    if(Boost_FOUND) 
    MESSAGE(STATUS "Found Boost: ${Boost_LIBRARY_DIRS}") 
    MESSAGE(STATUS "Found Boost libraries: ${Boost_LIBRARIES}") 
    set(LIBRARIES "${LIBRARIES};${Boost_LIBRARIES}") 
    else() 
    MESSAGE(FATAL_ERROR "Boost Thread NOT FOUND") 
    endif() 

target_link_libraries(executable ${LIBRARIES}) 
Cuestiones relacionadas