Рекурсивный поиск CMake для заголовков и исходных файлов - программирование
Подтвердить что ты не робот

Рекурсивный поиск CMake для заголовков и исходных файлов

Я новичок в CMake и хотел бы спросить, может ли кто-нибудь помочь в следующей проблеме.

У меня есть исходные и заголовочные файлы С++ в их соответствующих папках, и теперь я хочу создать текстовый файл CMake, который рекурсивно ищет их.

В настоящее время я делаю это следующим образом:

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) 

Это создает файл решения CarDetectorDAISY.sln, и когда я пытаюсь его построить, он показывает ошибка, что файлы заголовков не найдены (нет такого файла или каталога).

Было бы очень благодарно, если кто-то может мне помочь. Спасибо.

4b9b3361

Ответ 1

Вероятно, вам не хватает одной или нескольких include_directories. Добавление заголовков в список файлов в вызове add_executable фактически не добавляется к пути поиска компилятора - это удобная функция, благодаря которой они добавляются в структуру папок проекта в среде IDE.

Итак, в вашем корне, скажем, у вас есть /my _lib/foo.h, и вы хотите включить его в исходный файл как

#include "my_lib/foo.h"

Затем в вашем CMakeLists.txt вам нужно сделать:

include_directories(${CMAKE_SOURCE_DIR})

Если вместо этого вы просто хотите сделать

#include "foo.h"

то в файле CMakeLists.txt выполните

include_directories(${CMAKE_SOURCE_DIR}/my_lib)


Я должен упомянуть, что file(GLOB...) не является рекомендуемым способом для сбора вашего списка источников - вы должны просто добавить каждый файл явно в CMakeLists.txt. Делая это, если вы добавите или удалите исходный файл позже, CMakeLists.txt будет изменен, и CMake автоматически повторится при следующем попытке и сборке. Из документов для file:

Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из исходного дерева. Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда следует запросить регенерировать CMake.

Ответ 2

Чтобы еще раз прояснить одну точку в ответе Фрейзера:

Заголовки не должны передаваться на ADD_EXECUTABLE.

Причина в том, что предполагаемая команда компиляции в Linux, например, справедлива:

gcc main.c mylib.c

и не:

gcc main.c mylib.c mylib.h

Затем предварительный процессор C разбирает mylib.c и видит #include "mylib.h" и использует его путь поиска для этих файлов.

Вместо этого вместо include_directories мы изменим путь поиска препроцессора cpp, что является правильным подходом. В GCC это означает добавление флага -I в командную строку:

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