2011-10-19 17 views
9

Estoy tratando de usar cmake (en Linux con GNU make y g ++) para compilar un proyecto con dos subdirectorios: MyLib y MyApp. MyLib contiene fuente para una biblioteca estática; MyApp necesita vincularse con esa biblioteca. Estoy tratando de construir en Linux con makefiles generados utilizando el siguiente CMakeLists.txt:CMAKE: compilar biblioteca y vincularla

cmake_minimum_required (VERSION 2.6) 
project (MyProj) 
include_directories (MyLib) 
file(GLOB MyLibSrc MyLib/*.cpp) 
add_library(MyLibrary STATIC ${MyLibSrc}) 
file(GLOB MyAppSrc MyApp/*.cpp) 
add_executable(MyApplication ${MyAppSrc}) 
target_link_libraries(MyApplication MyLibrary) 

este 'casi' obras. Falla en el tiempo de enlace porque mientras genera libMyLibrary.a, está en la raíz. Cuando agrego:

link_directories(${MyProj_BINARY_DIR}) 

no hace la diferencia.

Tengo un par de preguntas (que están estrechamente relacionadas):

  1. ¿Cuál es la mejor manera de coaccionar cmake en la construcción de mi biblioteca y ejecutable en un 'directorio temporal' — dicen MyStage — para mantener objetivos separados de la fuente?
  2. ¿Cómo convenzo a cmake para vincular la aplicación con la biblioteca?
  3. Si quería construir una depuración y una versión, ¿cuál es la mejor manera de extender mis scripts cmake para hacer esto — asegurándose de que la aplicación de depuración enlaza con la biblioteca de depuración y la aplicación de lanzamiento contra la biblioteca de versiones?

Soy un recién llegado a cmake. He leído lo que puedo encontrar en la web, pero me encuentro luchando para que mi biblioteca se vincule con mi ejecutable. Este tipo de configuración, en mi opinión, debería ser bastante común. Un ejemplo del cual a la cuna sería muy útil, pero no he encontrado uno.

Respuesta

3
  1. Usar "fuera de la compilación de origen". Hacer un directorio utilizado sólo para la acumulación y al mismo tiempo en ella, llame

    cmake <path to the sources, it may be relative>
  2. O bien utilizar

    link_directories(${MyProj_BINARY_DIR}/MyLib)

    o hacer CMakeLists.txt en cada subdirectorio - que sería mejor para el proyecto más grande que muy pequeño.

  3. Esto es un poco complicado, consulte CMAKE_BUILD_TYPE en los documentos (puede configurarlo y/o "si"). También puede configurar desde la línea de comandos:

    cmake -DCMAKE_BUILD_TYPE=Debug
+0

puedo ver cómo (1) podría funcionar - aunque no creo que sea ordenada. No quiero CMakeLists.txt en mi 'directorio de preparación' junto a mi biblioteca, si puedo evitarlo. – aSteve

+0

Uhm, no, no, CMakeLists.txt permanece en el árbol de código fuente. La ruta que se pasa como argumento para cmake es el directorio que contiene el CMakeLists.txt de nivel superior. En esta configuración, el dir "staging" está completamente vacío antes de la invocación cmake. – kralyk

3

He descubierto la solución 'óptima' para (1) ... así, pensé que debería publicar aquí:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage) 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage) 

Lo que me confundió anteriormente es que las bibliotecas estáticas no son consideradas una BIBLIOTECA por Cmake: se consideran ARCHIVOS.

+0

¡La única respuesta útil que he encontrado! ¡Nombrar es tan confuso! – rationalcoder

15

Bueno, es mejor leer example y hacer exactamente lo que se sugiere.

cmake_minimum_required (VERSION 2.6) 
project (MyProj CXX) 
add_subdirectory(MyLib) 
add_subdirectory(MyApp) 

Luego, para cada subdirectorio especificado, CMakeLists.txt se crean

MYLIB \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_library(MyLib ${SRC_FILES}) 

MiApl \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_executable(MyApp ${SRC_FILES}) 
target_link_libraries(MyApp MyLib) 
Cuestiones relacionadas