我想在两个不同的目标中包含一个.cpp文件(在运行CMake后成为两个VS项目)。我想为这些项目设置不同的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行中没有考虑。这是真的还是我错过了什么?有办法解决这个问题吗?
谢谢!
答案 0 :(得分:17)
将set_target_properties
命令应用于项目而不是源文件:
add_executable(project1 myfile.cpp)
set_target_properties(project1 PROPERTIES COMPILE_FLAGS "flags1")
add_executable(project2 myfile.cpp)
set_target_properties(project2 PROPERTIES COMPILE_FLAGS "flags2")
目标上设置的标志将应用于目标中的所有来源。
答案 1 :(得分:5)
如果您遵循每个子目录哲学的一个目标,则可以使用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")
答案 2 :(得分:0)
我遇到了同样的问题(如何在同一源文件中指定每个目标预编译的头依赖项)。幸运的是,set_source_files_properties的效果只是当前目录(CMAKE_CURRENT_SOURCE_DIR)。我能够用它来提出以下内容:
Options -MultiViews
这是有效的,因为set_source_files_properties只对当前的CMakeLists.txt文件产生影响。包含的文件将具有$ {VARIENT}和$ {CMAKE_CURRENT_BINARY_DIR}的不同值,因为它包含在两个不同的CMakeLists.txt文件中。在包含LibSources.cmake文件之前,您还可以在每个varient的CMakeLists.txt文件中设置各种编译标志,预处理器定义或包含路径。
答案 3 :(得分:0)
我使用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()
并且在编译过程中,只有同时设置了两个选项,我才做事。
这完全独立于目录范围,而不是目录范围。
答案 4 :(得分:-1)
我解决了这个问题如下。在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没有更多可接受的解决方案