CMake no incluye el directorio de encabezado del submódulo A dentro del submódulo B
Tengo un proyecto CMake que se ve así:
project/
CMakeLists.txt
subprojectA/
CMakeLists.txt
include/
headerA.hpp
src/
libraryA.cpp
subprojectB/
CMakeLists.txt
src/
mainB.cpp
El subproyecto "biblioteca", A, se compila como una biblioteca estática, convirtiéndose en libsubprojectA.a. El proyecto "principal", B, se compila como binario y depende de la biblioteca. mainB.cpp incluye una referencia a headerA.hpp.
Aquí está el subproyecto A / CMakeLists.txt:
project(SubProjectA)
include_directories(include)
add_library(subprojectA STATIC src/libraryA.cpp)
set(${PROJECT_NAME}_INCLUDE_DIRS
${PROJECT_SOURCE_DIR}/include
CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
Y aquí está el subproyecto B / CMakeLists.txt:
project(SubProjectB)
include_directories(${SubProjectA_INCLUDE_DIRS})
add_executable(mainBinary src/mainB.cpp)
target_link_libraries(mainBinary subprojectA)
El proyecto principal CMakeLists.txt se ve así:
project(Project)
add_subdirectory(subprojectB)
add_subdirectory(subprojectA)
Tenga en cuenta que el subproyecto B, el proyecto principal, está en la listaantes de subproyectoA.
Aquí está el problema. Cuando ejecuté "cmake" por primera vez en este proyecto,${SubProjectA_INCLUDE_DIRS}
no está establecido en SubProjectB.
Lo que creo que está sucediendo es que las CMakeLists para SubProjectB se cargan primero, cuando${SubProjectA_INCLUDE_DIRS}
aún no se ha configurado. Establece su propia ruta de inclusión a una cadena vacía como resultado. Sin embargo, aunquelibsubprojectA.a
se construye con éxito antesmainBinary
, la ruta de inclusión ya estaba vacía de antemano. Como resultado, recibo este error cuando intento hacermainBinary
:
subprojectB/src/mainB.cpp:1:23: fatal error: headerA.hpp: No such file or directory
#include "headerA.hpp"
^
Es una solución alternativa poner el subproyecto A antes que el subproyecto B en el proyecto principal CMakeLists en el mundo declarativo de CMake. Lo que realmente quiero es saber la forma correcta de indicarle a CMake que elinclude_directories(${SubProjectA_INCLUDE_DIRS})
líneadepende en las definiciones que existen dentro de CMakeLists de SubProjectA. ¿Hay una mejor manera de hacer esto?