que tienen la siguiente estructura del proyecto:CRealice - dependencias (cabeceras) entre aplicaciones/bibliotecas en un mismo proyecto
- CMakeLists.txt
- LIB1/CMakeLists.txt y todos los archivos cpp y cabecera de la lib
- LIB2/CMakeLists.txt y todos los archivos cpp y cabecera de la lib
- app/CMakeLists.txt y todos los archivos cpp y cabecera de la aplicación
La principal CMakeLists.txt parece:
PROJECT(${PROJECT_NAME})
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
El lib1/CMakeLists.txt parece, por ejemplo, como (pelado):
SET(SOURCE
file.cpp
)
SET(HEADERS
some_lib_header.h
)
add_library(lib1 ${SOURCE} ${HEADERS})
y el de la aplicación tiene el mismo aspecto, salvo de ADD_EXECUTABLE:
SET(SOURCE
main.cpp
)
SET(HEADERS
some_header.h
)
add_library(lib1 ${SOURCE} ${HEADERS})
ADD_EXECUTABLE(app ${SOURCE} ${HEADERS})
me encontré con la configuración de trabajo, así de esta manera porque fuera de esto, puedo generar un archivo de solución de Visual Studio que contiene todos esos tres proyectos. Pero mi problema es que mi aplicación incluye archivos de encabezado de lib1 (y también de lib2, que depende de lib1). Cuando hago
$mkdir build
$cd build
$cmake -C ..\myproject
se genera fuera de la fuente VS archivo .sln como yo quiero, pero la aplicación no se compila porque no puede encontrar los archivos de cabecera de LIB1 (obviamente).
Ahora leo y probado muchas cosas, como TARGET_LINK_LIBRARIES(app lib1)
(que tiene la aplicación para enlazar con la LIB1, pero no resuelve el problema de incluir cabecera), y cosas como add_subdirectory(../lib1)
en diversas variantes en el CMakeLists.txt de aplicación (que todos arrojaron errores que no pude solucionar), y también find_package (que supongo que es el enfoque equivocado).
Entonces, ¿cómo puedo resolver este problema (supongo que simple ...)?
El proyecto es bastante grande, así que no me gusta una sola CMakeLists.txt. – Ela782
Su primera solución propuesta tiene un problema: especifica un proyecto (...) al comienzo de cada archivo lib/app CMakeLists.txt. ¿No es ese el mal estilo y debería usar project (...) solo una vez en la raíz CMakeLists.txt? Además, si uso project (...) en cada archivo CMakeLists.txt, CMake genera un archivo .sln para cada proyecto (además del .sln raíz con todos los proyectos) y otras cosas innecesarias, que es bueno de sobrecarga que nunca se usa y probablemente tampoco es la mejor solución? – Ela782
@ Ela782 Sí - sin preocupaciones. Múltiples archivos CMakeLists.txt pueden simplificar las cosas bastante bien para cualquier cosa que no sea el más pequeño de los proyectos. – Fraser