Ответ 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. Например:.