Я хотел бы включить файл .cpp в две разные цели (превратившись в два проекта VS после запуска CMake). Я хотел бы установить разные COMPILE_FLAGS для этих проектов.
Однако, когда я делаю
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags1")
ADD_EXECUTABLE(project1 myfile.cpp)
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags2")
ADD_EXECUTABLE(project2 myfile.cpp)
, «flags2» применяется к обоим проектам, поэтому кажется, что свойства перезаписываются в строке 3 и не учитываются в строке 2. Является это правда или я что-то упускаю? Есть ли способ решить эту проблему?
Спасибо!
Я решил эту проблему с помощью 2 флагов, один для исходного файла, один для цели.
macro(enable_on_source target src)
set_source_files_properties(${src}
PROPERTIES COMPILE_OPTIONS "-OptionModule")
set_target_properties(${target}
PROPERTIES COMPILE_OPTIONS "-OptionTarget")
endmacro()
и во время компиляции я делаю вещи, только если установлены обе опции.
Это абсолютно независимое от объемов каталога и что нет.
Если вы придерживаетесь одной цели для каждой подкаталоги, вы можете сделать следующее, используя add_definitions
, чтобы добавить свои флаги компиляции.
# in ./CMakeLists.txt
add_subdirectory(project1)
add_subdirectory(project2)
# in ./project1/CMakeLists.txt:
add_definitions("flags1")
add_executable(project1 ../myfile.cpp)
# in ./project2/CMakeLists.txt:
add_definitions("flags2")
add_executable(project2 ../myfile.cpp)
add_definitions
применяется ко всем файлам, скомпилированным в этом подкаталоге, и к тем, которые находятся в нем. Вы можете применить флаги к определенным файлам, используя следующее:
set_source_files_properties(myfile.cpp PROPERTIES COMPILE_FLAGS "flags")
Я решаю эту проблему следующим образом. В CMakeLists.txt:
set_target_properties (test1 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=1")
set_target_properties (test2 PROPERTIES COMPILE_DEFINITIONS "TARGET_ID=9")
set_source_files_properties (source1.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=7")
set_source_files_properties (source2.cpp PROPERTIES COMPILE_DEFINITIONS "FILE_ID=4")
В некоторых файлах заголовков:
#if TARGET_ID==1 && FILE_ID==7
#define SPECIAL_VALUE 17
#elif TARGET_ID==1 && FILE_ID==4
#define SPECIAL_VALUE 14
#elif TARGET_ID==9 && FILE_ID==7
#define SPECIAL_VALUE 97
#elif TARGET_ID==9 && FILE_ID==4
#define SPECIAL_VALUE 94
#endif
Далее, включите вышеупомянутый заголовок в source1.cpp и source2.cpp и компиляция Я думаю, что CMake не имеет более приемлемого решения