Добавление нескольких исполняемых файлов в CMake
мой код в проекте C++ организован следующим образом
- у меня есть несколько
.cpp
и.h
файлы, которые содержат мои классы - у меня есть несколько
.cxx
файлы, которые должны быть скомпилированы против.cpp
файлы и некоторые внешние библиотеки.
теперь, каждый из .cxx
файлы main()
метод, поэтому мне нужно добавить другой исполняемый файл для каждого из этих файлов, имеющих то же имя, что и файл.
кроме того, эти .cxx
файлы могут не быть связаны с теми же внешними библиотеками.
Я хочу написать эту сборку в CMake, в которой я вроде как Новичок, как мне это сделать?
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 не будет автоматически перестраиваться при добавлении нового файла. Я использовал его здесь, потому что я не знаю ваши исходные файлы.- в некоторых ситуациях исходные файлы могут быть найдены с полным именем пути. При необходимости используйтеотносительный флаг для
find( GLOB ... )
.- ручная настройка исходных файлов требует изменения CMakeLists.txt, который запускает перестройку. Смотрите этот вопрос для (dis-)преимуществ глоббинга.
- я сгенерировал имя теста с помощью
string( REPLACE ... )
. Я мог бы использовать get_filename_component СNAME_WE
флаг.что касается" общей "информации CMake, я советую вам прочитать некоторые из широких вопросов "обзора CMake", уже заданных здесь сайте StackOverflow. Например: