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