不同目标中相同文件的不同编译标志

时间:2011-07-12 14:32:44

标签: cmake

我想在两个不同的目标中包含一个.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行中没有考虑。这是真的还是我错过了什么?有办法解决这个问题吗?

谢谢!

5 个答案:

答案 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没有更多可接受的解决方案