#cmake
#cmake
Вопрос:
В моем конкретном проекте CMake у меня есть три файла CPP:
a.cpp
b.cpp
c.cpp
Я хочу ‘a.cpp ‘ должен быть скомпилирован во всех конфигурациях (release amp; debug).
Я только хочу ‘b.cpp ‘ должен быть скомпилирован в конфигурации ОТЛАДКИ.
Я только хочу ‘c.cpp ‘ должен быть скомпилирован в конфигурации ВЫПУСКА.
Как я могу это сделать? Мне нужно что-то похожее на debug
optimized
ключевые слова and, которые принимаются target_link_libraries()
операцией CMake.
Ответ №1:
Насколько я знаю, cmake не предоставляет способа исключить некоторые файлы на основе конфигурации. Поэтому вам нужен обходной путь для достижения такого поведения.
Например, вы можете обернуть все содержимое b.cpp
и c.cpp
с помощью некоторого защитного макроса:
#ifdef BUILD_ME
//original content of your file
#endif
и затем установите определения компилятора, зависящие от конфигурации, в cmake:
if (${CMAKE_GENERATOR} MATCHES "Make" AND "${CMAKE_BUILD_TYPE}" STREQUAL "")
# This block might be needed because CMAKE_BUILD_TYPE is usually
# undefined for makefiles.
# And COMPILE_DEFINITIONS_RELEASE are not chosen by default.
set(CMAKE_BUILD_TYPE RELEASE)
endif()
set_source_files_properties(b.cpp PROPERTIES COMPILE_DEFINITIONS_DEBUG BUILD_ME )
set_source_files_properties(c.cpp PROPERTIES COMPILE_DEFINITIONS_RELEASE BUILD_ME )
add_executable(target_name a.cpp b.cpp c.cpp)
Ответ №2:
Эта проблема была исправлена с 3.17: https://cmake.org/cmake/help/latest/release/3.17.html#generators
«Генераторы Visual Studio научились поддерживать исходные файлы для каждой конфигурации. Ранее их поддерживали только генераторы инструментов сборки командной строки «.