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)
我有什么想念的吗?
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_properties与COMPILE_FLAGS:
set_source_files_properties(File2.cpp PROPERTIES COMPILE_FLAGS -fno-rtti)
Run Code Online (Sandbox Code Playgroud)