c++ build cmake executable

c++ - Agregar mĂșltiples ejecutables en CMake



build executable (1)

Mi sugerencia es abordar esto en dos fases:

  1. Cree una biblioteca desde los archivos .cpp y .h , usando add_library
  2. Itere a través de todos sus archivos .cxx y cree un ejecutable de cada uno, usando add_executable y foreach

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 indicador NAME_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?