如何在CMAKE中针对不同文件使用不同的编译选项进行编译?

Utk*_*mar 3 c++ boost cmake rtti clang

我有一个像这样的项目:

|--CMakeLists.txt(1)
|--File1.cpp -W -W-all
|--Folder1
    |--CMakeLists.txt(2)
    |--File2.cpp -W -W-all -fno-rtti
Run Code Online (Sandbox Code Playgroud)

如上所示,File2.cpp需要使用进行编译,-fno-rtti而其他文件则应使用进行编译rtti。发生这种情况是因为我在项目中同时使用了clang和boost库。我这样写CMakeLists.txt(1)

SET (CMAKE_CXX_FLAGS "-std=c++11 -fexceptions -fno-rtti -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -Wno-long-long" )
Run Code Online (Sandbox Code Playgroud)

并且,CMakeLists.txt(2)我添加了以下内容:

add_definitions( -fno-rtti ) 
Run Code Online (Sandbox Code Playgroud)

上面没有用。实际上,以下任何一项均不适用于CMakeLists.txt(2)

set_property(SOURCE File2.cpp APPEND_STRING PROPERTY CMAKE_CXX_FLAGS " -fno-rtti ")
set_property(SOURCE File2.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " -fno-rtti ")
ADD_DEFINITIONS(CMAKE_CXX_FLAGS " -fno-rtti ")
ADD_DEFINITIONS(COMPILE_FLAGS " -fno-rtti ")
ADD_DEFINITIONS( -fno-rtti )
Run Code Online (Sandbox Code Playgroud)

我有什么想念的吗?

was*_*ful 8

AFAIK CMake不允许为每个文件指定编译选项。最好的办法是为要使用编译的文件创建目标-fno-rtti,例如使用add_library,然后将编译选项添加到该目标。

add_definitions旨在添加预处理器定义。您应该考虑add_compile_options

add_compile_options(-fno-rtti)
Run Code Online (Sandbox Code Playgroud)

为避免全球污染,并确保将选项添加到给定目标,可以考虑使用target_compile_options

target_compile_options(foo PUBLIC -fno-rtti)
Run Code Online (Sandbox Code Playgroud)

无关,但不要使用手动设置标志以启用c ++ 11,而是set(CMAKE_CXX_FLAGS "-std=c++11 ...")让cmake使用编译功能,或者至少使用标准选择来做更细粒度的工作:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
Run Code Online (Sandbox Code Playgroud)

编辑:

在文档中更仔细寻找,你可以设置使用每个源文件编译标志set_source_files_propertiesCOMPILE_FLAGS

set_source_files_properties(File2.cpp PROPERTIES COMPILE_FLAGS -fno-rtti)
Run Code Online (Sandbox Code Playgroud)

  • 为了避免全局污染,使用`PRIVATE` 而不是`PUBLIC` 目标编译选项不是更好吗? (2认同)