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


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

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

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

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

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

1 54

1 ответ:

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

  1. построить библиотеку из .cpp и .h файлы, используя add_library
  2. перебрать все .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 не будет автоматически перестраиваться при добавлении нового файла. Я использовал его здесь, потому что я не знаю ваши исходные файлы.
  • в некоторых ситуациях исходные файлы могут быть найдены с полным именем пути. При необходимости используйтеотносительный флаг для find( GLOB ... ).
  • ручная настройка исходных файлов требует изменения CMakeLists.txt, который запускает перестройку. Смотрите этот вопрос для (dis-)преимуществ глоббинга.
  • я сгенерировал имя теста с помощью string( REPLACE ... ). Я мог бы использовать get_filename_component С NAME_WE флаг.

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