c++ - online - ¿Cómo agregar correctamente incluir directorios con CMake?
descarga cmake (3)
Hace aproximadamente un año pregunté sobre las dependencias de encabezado en CMake .
Me di cuenta recientemente de que el problema parecía ser que CMake consideraba que esos archivos de encabezado eran externos al proyecto. Al menos, al generar un proyecto Code :: Blocks, los archivos de encabezado no aparecen dentro del proyecto (los archivos fuente sí). Por lo tanto, me parece que CMake considera que esos encabezados son externos al proyecto, y no los rastrea en las dependencias.
Una búsqueda rápida en el tutorial de CMake solo apuntaba a include_directories
que no parece hacer lo que deseo ...
¿Cuál es la forma correcta de indicar a CMake que un directorio en particular contiene encabezados para ser incluidos, y que esos encabezados deben ser rastreados por el Makefile generado?
CMake es más parecido a un lenguaje de script si se compara con otras formas de crear Makefile (por ejemplo, make o qmake). No es muy genial como Python, pero aún así.
No existe la " forma correcta " de buscar en varios proyectos de código abierto cómo las personas incluyen directorios. Pero hay dos formas de hacerlo.
Crudo include_directories agregará el directorio al proyecto actual y todos los demás proyectos descendientes que agregará a través de una serie de comandos add_subdirectory . A veces las personas dicen que ese enfoque es legado.
target_include_directories más elegante de los target_include_directories . Permite agregar un directorio para un proyecto / objetivo específico sin (tal vez) herencia o incompatibilidad de varios directorios inlude. También permite realizar incluso la configuración sublte y agregar uno de los siguientes marcadores para este comando
PRIVADO : Úselo solo para este objetivo de compilación especificado
PUBLIC - Úselo para el objetivo específico y para los objetivos que se vincula con este proyecto
INTERFAZ : Úselo solo para los objetivos que enlazan con el proyecto actual
PD
Ambos comandos permiten marcar el directorio como SISTEMA para dar una pista de que si no es su negocio, los directorios especificados incluirán avisos.
Respuesta similar es con otros pares de comandos target_compile_definitions / add_definitions , target_compile_definitions / CMAKE_C_FLAGS
Dos cosas deben hacerse.
Primero agregue el directorio que se incluirá:
target_include_directories(test PRIVATE ${YOUR_DIRECTORY})
En caso de que esté atrapado con una versión de CMake muy antigua (2.8.10 o anterior) sin soporte para target_include_directories
, también puede usar los legacy include_directories
lugar:
include_directories(${YOUR_DIRECTORY})
Luego, también debe agregar los archivos de encabezado a la lista de sus archivos de origen para el destino actual, por ejemplo:
set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})
De esta forma, los archivos de encabezado aparecerán como dependencias en el Makefile, y también, por ejemplo, en el proyecto de estudio visual generado, si usted genera uno.
Editar: cómo usar esos archivos de encabezado para varios objetivos
set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_library(mylib libsrc.cpp ${HEADER_FILES})
target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})
add_executable(myexec execfile.cpp ${HEADER_FILES})
target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})
En primer lugar, utiliza include_directories()
para indicar a CMake que agregue el directorio como -I
a la línea de comandos de compilación. En segundo lugar, enumera los encabezados en su add_executable()
o add_library()
.
Como ejemplo, si las fuentes de su proyecto están en src
, y necesita encabezados de include
, podría hacerlo así:
include_directories(include)
add_executable(MyExec
src/main.c
src/other_source.c
include/header1.h
include/header2.h
)