如何在CMAKE中使用不同的编译选项进行编译
How to compile with different compile options for different files in CMAKE?
>我有一个这样的项目:
|--CMakeLists.txt(1)
|--File1.cpp -W -W-all
|--Folder1
|--CMakeLists.txt(2)
|--File2.cpp -W -W-all -fno-rtti
正如你在上面看到的,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" )
并且,在CMakeLists.txt(2)
中,我添加了以下内容:
add_definitions( -fno-rtti )
以上没有奏效。事实上,以下这些在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 )
我错过了什么吗?
AFAIK CMake 不允许为每个文件指定编译选项。你能做的最好的事情就是为你想要用-fno-rtti
编译的文件创建一个目标,例如用add_library
,并将编译选项添加到这个目标。
add_definitions
旨在添加预处理器定义。您应该考虑add_compile_options
:
add_compile_options(-fno-rtti)
为避免全球污染并确保仅将选项添加到给定目标,您可以考虑使用target_compile_options
:
target_compile_options(foo PUBLIC -fno-rtti)
不相关,但不是手动设置标志以启用带有set(CMAKE_CXX_FLAGS "-std=c++11 ...")
的 c++11,而是让 cmake 使用编译功能或至少使用标准选择做更细粒度的工作:
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
编辑:
更仔细地查看文档,您可以使用带有COMPILE_FLAGS set_source_files_properties为每个源文件设置编译标志:
set_source_files_properties(File2.cpp PROPERTIES COMPILE_FLAGS -fno-rtti)
相关文章:
- 直接传递编译选项(绕过 CMakeLists.txt)
- 如何在 OSX 10.15 中使用 Clang -Wno-nullability-completeness 选项编译整个
- 为什么cmake还为导入的包添加编译选项
- CMake:如何清除目标编译选项
- 如何在CMAKE中使用不同的编译选项进行编译
- 使用 C++11 选项编译 C++98 代码时由于 Boost 标头而导致的不明确重载
- 使用 scons 在 windows 下编译C++代码,scons 添加"/Fo"作为编译选项
- g 编译选项,带有-STD = C 14编译错误显示Werror = C 11 -Compat
- 为什么在不同的计算机体系结构上,相同的GCC的编译选项会有所不同
- G 越野车吗?还有clang ?G 使用-O0和-O1选项编译了代码,而对于-O0和-O2,Clang
- Eclipse:如何启用编译选项,在C++中编译错误,OpenCL程序
- 使用gcc调试选项编译生产代码是否有任何副作用
- 使用 -g 选项编译,但"Single stepping until exit from function main, which has no line number information"
- 什么是 -fPIC 编译选项?
- Visual Studio 中编译选项 /DPROFILE 和 /UPROFILE 的含义是什么Microsoft?
- 使用带有自定义对齐分配器实现的最新g++,使用SSE和-O3选项编译时出现非法指令(核心转储)
- 如何查看英特尔 ICC 编译器上启用了哪些编译选项
- D8048:无法使用 /ZW 选项编译 C 文件 'openssl\applink.c'
- 如果我使用c++11功能编译一个文件,同时将其链接到一个没有c++11编译器选项编译的库,会有什么问题吗
- 使用gcc用-D选项编译多个文件