c++ - Agregar mĂșltiples ejecutables en CMake
build executable (1)
Mi sugerencia es abordar esto en dos fases:
- Cree una biblioteca desde los archivos
.cpp
y.h
, usandoadd_library
- Itere a través de todos sus archivos
.cxx
y cree un ejecutable de cada uno, usandoadd_executable
yforeach
Construye la biblioteca
Esto podría ser algo tan simple como
file( GLOB LIB_SOURCES lib/*.cpp )
file( GLOB LIB_HEADERS lib/*.h )
add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )
Construye todos los ejecutables
Simplemente recorra todos los archivos .cpp y cree ejecutables por separado.
# If necessary, use the RELATIVE flag, otherwise each source file may be listed
# with full pathname. RELATIVE may makes it easier to extract an executable name
# automatically.
# file( GLOB APP_SOURCES RELATIVE app/*.cxx )
file( GLOB APP_SOURCES app/*.cxx )
foreach( testsourcefile ${APP_SOURCES} )
# I used a simple string replace, to cut off .cpp.
string( REPLACE ".cpp" "" testname ${testsourcefile} )
add_executable( ${testname} ${testsourcefile} )
# Make sure YourLib is linked to each app
target_link_libraries( ${testname} YourLib )
endforeach( testsourcefile ${APP_SOURCES} )
Algunas advertencias:
-
file( GLOB )
generalmente no se recomienda, porque CMake no se volverá a generar automáticamente si se agrega un archivo nuevo. Lo usé aquí, porque no sé tus archivos de origen. - En algunas situaciones, los archivos fuente se pueden encontrar con un nombre de ruta completo. Si es necesario, use la bandera RELATIVA para
find( GLOB ... )
. - La configuración manual de los archivos fuente requiere un cambio a CMakeLists.txt, que desencadena una reconstrucción. Vea esta pregunta para las (des) ventajas de globbing.
- Genere el nombre de prueba usando una
string( REPLACE ... )
. Podría haber usado get_filename_component con el indicadorNAME_WE
.
En cuanto a la información CMake "general", te aconsejo que leas algunas de las amplias preguntas sobre "CMake Overview" ya hechas aquí en stackoverflow. P.ej:
Mi código en un proyecto de C ++ está organizado de la siguiente manera
- Tengo varios archivos
.cpp
y.h
que contienen mis clases - Tengo varios archivos
.cxx
que deben compilarse contra los archivos.cpp
y algunas bibliotecas externas.
Ahora, cada uno de los archivos .cxx
tiene un método main()
, por lo que necesito agregar un ejecutable diferente para cada uno de estos archivos con el mismo nombre que el archivo.
Además, estos archivos .cxx
pueden no estar vinculados a las mismas bibliotecas externas.
Quiero escribir esta compilación en CMake, en la que soy un novato, ¿cómo hago para esto?