tutorial gui build cmake build-process build-automation

build - gui - cmake tutorial



Búsqueda recursiva de CMake para encabezados y archivos de origen (2)

Probablemente te estés perdiendo una o más llamadas include_directories . Agregar encabezados a la lista de archivos en la llamada add_executable realidad no se agrega a la ruta de búsqueda del compilador, es una característica conveniente por la cual solo se agregan a la estructura de carpetas del proyecto en los IDE.

Entonces, en su raíz, digamos que tiene /my_lib/foo.h, y desea incluir eso en un archivo fuente como

#include "my_lib/foo.h"

Luego, en tu CMakeLists.txt, debes hacer:

include_directories(${CMAKE_SOURCE_DIR})

Si, en cambio solo quieres hacer

#include "foo.h"

luego en el CMakeLists.txt, haz

include_directories(${CMAKE_SOURCE_DIR}/my_lib)


Debería mencionar que el file(GLOB...) no es la forma recomendada de recopilar su lista de fuentes: realmente debe agregar cada archivo explícitamente en el CMakeLists.txt. Al hacer esto, si agrega o elimina un archivo de origen más tarde, se modifica CMakeLists.txt, y CMake se vuelve a ejecutar automáticamente la próxima vez que intente compilar. De los documentos para el file :

No recomendamos utilizar GLOB para recopilar una lista de archivos de origen de su árbol de origen. Si ningún archivo CMakeLists.txt cambia cuando se agrega o elimina una fuente, el sistema de compilación generado no puede saber cuándo pedirle a CMake que se regenere.

Soy nuevo en CMake y me gustaría preguntar si alguien puede ayudar en el siguiente problema.

Tengo los archivos de fuente y encabezado de C ++ en sus respectivas carpetas y ahora quiero crear un archivo de texto CMake que los busque de forma recursiva.

Actualmente lo estoy haciendo de esta manera:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(CarDetectorDAISY) file(GLOB_RECURSE SRCS *.cpp) file(GLOB_RECURSE HDRS *.h) ADD_EXECUTABLE(stereo_framework ${SRCS} ${HDRS}) TARGET_LINK_LIBRARIES(stereo_framework)

Esto crea mi archivo de solución CarDetectorDAISY.sln y cuando intento compilarlo, muestra un error que indica que no se encuentran los archivos de encabezado (no existe tal archivo o directorio).

Estaría muy agradecido si alguien me puede ayudar por favor. Gracias.


Solo para aclarar un punto en la respuesta de Fraser:

Los encabezados no deben pasarse a ADD_EXECUTABLE .

La razón es que el comando de compilación previsto en Linux, por ejemplo, es simplemente:

gcc main.c mylib.c

y no:

gcc main.c mylib.c mylib.h

El preprocesador de C luego analiza mylib.c y ve un #include "mylib.h" , y usa la ruta de búsqueda para esos archivos.

Al utilizar include_directories lugar, modificamos la ruta de búsqueda del preprocesador cpp, que es el enfoque correcto. En GCC, esto se traduce en agregar el indicador -I a la línea de comando:

gcc -Inew/path/to/search/for/headers main.c mylib.c