Подтвердить что ты не робот

Как использовать все файлы *.c в каталоге с системой сборки Cmake?

Я хочу найти все файлы .c в каталоге и добавить их в файлы SRC для компиляции в cmake. Как это сделать в CMakeList.txt.

для обычных make файлов я могу создать

SPECIFIED_SRC_FILE  = $(foreach d,$(SPECIFIED_SRC_DIRS),$(wildcard $(addprefix $(d)/*,*.c)))

но я не мог понять, как сделать что-то подобное в CMakeList.txt.

4b9b3361

Ответ 1

Попробуйте следующее:

AUX_SOURCE_DIRECTORY

Найти все исходные файлы в каталоге.

AUX_SOURCE_DIRECTORY(dir VARIABLE) 

Собирает имена всех исходных файлов в указанном каталоге и сохраняет список в предоставленной переменной. Эта команда предназначена для использования проектами, использующими явное создание шаблона. Файлы экземпляра шаблона могут храниться в "Шаблонах", подкаталог и автоматически собираются с помощью этой команды, чтобы избежать вручную перечисляя все экземпляры.

Заманчиво использовать эту команду, чтобы избежать записи списка источников файлы для библиотеки или исполняемой цели. Хотя это, похоже, работает, CMake не может создать систему сборки, которая знает, когда добавлен новый исходный файл. Обычно сгенерированная система сборки знает, когда нужно перезапустить CMake, потому что файл CMakeLists.txt для добавления нового источника. Когда источник просто добавлен к каталог без изменения этого файла, нужно было бы вручную Перезапустите CMake, чтобы создать систему сборки, включающую новый файл.

Ответ 2

Как насчет хорошего старого глотания?

FILE(GLOB MyCSources *.c)
ADD_EXECUTABLE(MyExecutable ${MyCSources})

Ответ 3

Да, у вас есть два варианта. Допустим, у вас структура папок чем-то похожа на эту.

├── autopilot
            │   ├── _AutoPilot.cpp
            │   ├── _AutoPilot.h
            │   └── action
            │       ├── ActionBase.cpp
            │       ├── ActionBase.h
            │       ├── APcopter
            │       │   ├── APcopter_avoid.cpp
            │       │   ├── APcopter_avoid.h

Если вы хотите использовать AUX_SOURCE_DIRECTORY, вы должны добавить CMakeLists.txt в каждый из подкаталогов. Затем вы должны включить и связать все эти подкаталоги. Это довольно сложная задача. Таким образом, вы можете GLOB и делать работу очень легко. Вот как это делается.

  file(GLOB autopilot_sources ./**.cpp ./**.c)
  SET( autopilot ${autopilot_sources})  

Если вы хотите создать библиотеку, используя приведенный выше исходный код, это команда:

  ADD_LIBRARY ( autopilot  ${autopilot})
  TARGET_LINK_LIBRARIES ( autopilot)  

Если вы хотите создать исполняемый файл, используя приведенный выше исходный код, это команда:

 ADD_EXECUTABLE(autopilot ${autopilot})

Ответ 4

GLOB_RECURSE рекурсивный пример

В основном это означает, что * также входит в подкаталоги:

cmake_minimum_required(VERSION 3.0)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.c")
add_executable(main ${SOURCES})

И тогда наши источники могут быть расположены, например, как:

src/main.c
src/d/a.c
src/d/a.h

И main.c использует #include "d/a.h" и a.c использует #include "a.h".

Использование GLOB_RECURSE в CMLE топлесс (т.е. "*.c" вместо "src/*.c"), вероятно, является плохим, так как он может собирать файлы .c, созданные самим CMake, которые помещаются под build/.

Runnable example на GitHub.

Ответ 5

Вы можете использовать AUX_SOURCE_DIRECTORY как описано в описании @whitequark, но он не будет работать так, как вы ожидаете, поскольку CMake не сможет определить, когда будут добавлены новые файлы (что является целым рядом с использованием подстановочного знака).