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

Добавление нескольких исполняемых файлов в CMake

Мой код в проекте С++ организован следующим образом

  • У меня есть несколько файлов .cpp и .h, которые содержат мои классы
  • У меня есть несколько файлов .cxx, которые необходимо скомпилировать с файлами .cpp и некоторыми внешними библиотеками.

Теперь каждый из файлов .cxx имеет метод main(), поэтому мне нужно добавить другой исполняемый файл для каждого из этих файлов с тем же именем, что и файл.

Кроме того, эти файлы .cxx могут не привязываться к тем же внешним библиотекам.

Я хочу написать эту сборку в CMake, в которой я как бы новичок, как мне это сделать?

4b9b3361

Ответ 1

Мое предложение состоит в том, чтобы решить эту проблему в два этапа:

  • Создайте библиотеку из файлов .cpp и .h, используя add_library
  • Итерируйте через все ваши файлы .cxx и создайте исполняемый файл из каждого, используя add_executable и foreach

Сборка библиотеки

Это может быть что-то простое, как

file( GLOB LIB_SOURCES lib/*.cpp )
file( GLOB LIB_HEADERS lib/*.h )
add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )

Построить все исполняемые файлы

Просто зациклируйте все .cpp файлы и создайте отдельные исполняемые файлы.

# If necessary, use the RELATIVE flag, otherwise each source file may be listed 
# with full pathname. RELATIVE may makes it easier to extract an executable name
# automatically.
# file( GLOB APP_SOURCES RELATIVE app/*.cxx )
file( GLOB APP_SOURCES app/*.cxx )
foreach( testsourcefile ${APP_SOURCES} )
    # I used a simple string replace, to cut off .cpp.
    string( REPLACE ".cpp" "" testname ${testsourcefile} )
    add_executable( ${testname} ${testsourcefile} )
    # Make sure YourLib is linked to each app
    target_link_libraries( ${testname} YourLib )
endforeach( testsourcefile ${APP_SOURCES} )

Некоторые предупреждения:

  • file( GLOB ) обычно не рекомендуется, потому что CMake не будет автоматически перестраиваться при добавлении нового файла. Я использовал его здесь, потому что я не знаю ваших исходных файлов.
  • В некоторых ситуациях исходные файлы могут быть найдены с полным именем пути. Если необходимо, используйте флаг RELATIVE для find( GLOB ... ).
  • Для ручной установки исходных файлов требуется изменение в CMakeLists.txt, которое запускает перестройку. См. этот вопрос для (dis-) преимуществ globbing.
  • Я сгенерировал имя теста, используя string( REPLACE ... ). Я мог бы использовать get_filename_component с флагом NAME_WE.

Что касается "общей" информации CMake, я советую вам прочитать некоторые из общих вопросов "Обзор CMake", которые уже заданы здесь в stackoverflow. Например:.