Hace aproximadamente un año, pregunté sobre las dependencias de encabezado en CMake .
Recientemente me di cuenta 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 de origen 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 señaló include_directories
que no parece hacer lo que deseo ...
¿Cuál es la forma correcta de indicarle a CMake que un directorio en particular contiene encabezados para incluir, y que esos encabezados deben ser rastreados por el Makefile generado?
.cbp
archivo del proyecto. Ahora, si el escáner de dependencia de cmake no identifica correctamente un archivo de encabezado como una dependencia para un Makefile, hay formas de solucionarlo, pero en algunos casos se equivocará porque no incluye un preprocesador completo.Respuestas:
Hay que hacer dos cosas.
Primero agregue el directorio que se incluirá:
En caso de que esté atascado con una versión CMake muy antigua (2.8.10 o anterior) sin soporte
target_include_directories
, también puede usar el legado en suinclude_directories
lugar:Luego, también debe agregar los archivos de encabezado a la lista de sus archivos de origen para el destino actual, por ejemplo:
De esta forma, los archivos de encabezado aparecerán como dependencias en el Makefile, y también, por ejemplo, en el proyecto generado de Visual Studio, si genera uno.
Cómo usar esos archivos de encabezado para varios objetivos:
fuente
LIBROOT_HEADER_FILES
variable inliba/CMakefile
ylibb/CMakefile
luego?include_directories
mástarget_include_directories
. El primero lo establece recursivamente para todos los objetivos en ese directorio; mientras que este último lo establece como objetivo. Hacer lo primero rompe la noción de un gráfico de destino en CMake y, en cambio, depende de los efectos secundarios de la jerarquía de archivos.target_include_directories
el código CMake moderno. No dude en invitarme a un chat si no está de acuerdo con los cambios.Primero, usted le
include_directories()
dice a CMake que agregue el directorio-I
a la línea de comando de compilación. En segundo lugar, enumera los encabezados en suadd_executable()
oadd_library()
llamada.Como ejemplo, si las fuentes de su proyecto están incluidas
src
y necesita encabezadosinclude
, puede hacerlo así:fuente
add_executable
? Pensé que CMake descubrió las dependencias del archivo de inclusión automáticamente.CMake es más como un lenguaje de script si lo compara con otras formas de crear Makefile (por ejemplo, make o qmake). No es tan genial como Python, pero aún así.
No existe una " forma adecuada " si se observa en varios proyectos de código abierto cómo las personas incluyen directorios. Pero hay dos formas de hacerlo.
Los include_directories brutos agregarán un directorio al proyecto actual y a todos los demás proyectos descendientes que agregará a través de una serie de comandos add_subdirectory . A veces la gente dice que ese enfoque es legado.
Una forma más elegante es con target_include_directories . Permite agregar un directorio para un proyecto / objetivo específico sin (tal vez) herencia innecesaria o choque de varios directorios de inclusión. También permita realizar incluso una configuración sutil y agregue uno de los siguientes marcadores para este comando.
PRIVADO : se usa solo para este objetivo de compilación especificado
PÚBLICO : utilícelo para el objetivo especificado y para los objetivos que se vinculan con este proyecto
INTERFAZ : úsela solo para objetivos que se vinculan con el proyecto actual
PD:
Ambos comandos permiten marcar un directorio como SYSTEM para dar una pista de que no es asunto suyo que los directorios especificados contengan advertencias.
Una respuesta similar es con otros pares de comandos target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS
fuente
Añadir
include_directories("/your/path/here")
.Esto será similar a llamar
gcc
con-I/your/path/here/
opción.Asegúrese de poner comillas dobles alrededor del camino. Otras personas no mencionaron eso y me hicieron quedar atrapado durante 2 días. Entonces, esta respuesta es para personas que son muy nuevas en CMake y están muy confundidas.
fuente
Yo tuve el mismo problema.
Mi directorio de proyectos era así:
Y lo que solía incluir los archivos en todas esas carpetas:
Y funcionó totalmente.
fuente