设置库的编译标志
CMAKE - setting compile flags for libraries
我有一个CMakeLists.txt脚本来编译我的库。问题是我不能为库设置编译标志。
我试过了
SET(CMAKE_CXX_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_CXX_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_CXX_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_C_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_C_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_C_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_EXE_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_MODULE_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_SHARED_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
SET(CMAKE_STATIC_LINKER_FLAGS "/W3 /nologo /EHsc")
SET(CMAKE_STATIC_LINKER_FLAGS_DEBUG "/MTd /Od /Ob0 /Zi /RTC1 /DDEBUG /D_DEBUG")
SET(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/MT /O2 /Ob2 /DNDEBUG")
我可以改变一个库的标志的唯一方法是这样的。
SET_TARGET_PROPERTIES(MyLib PROPERTIES COMPILE_FLAGS "/W3 /nologo /EHsc")
,这将改变Debug和Release
的标志。如何在世界上我可以设置发布和调试标志分别为一个库使用CMake?
这些是您在第一种方法中尝试覆盖的全局缓存变量。
在本地更改这些编译器/链接器选项,您需要特定于配置的目标属性或生成器表达式。所以采取你的第二种方法,我怎么能设置特定的编译器标志在一个特定的构建配置使用CMake的特定目标?我会得到:
target_compile_options(
MyLib PRIVATE
/W3 /nologo /EHsc
"$<$<CONFIG:Debug>:/MTd;/Od;/Ob0;/Zi;/RTC1;/DDEBUG;/D_DEBUG>"
"$<$<CONFIG:Release>:/MT;/O2;/Ob2;/DNDEBUG>"
)
或CMake版本<= 2.8.12(另见CMP0043政策):
set_target_properties(
MyLib PROPERTIES
COMPILE_FLAGS
"/W4 /nologo /EHsc"
COMPILE_FLAGS_DEBUG
"/MTd /Od /Ob0 /Zi /RTC1"
COMPILE_FLAGS_RELEASE
"/MT /O2 /Ob2"
COMPILE_DEFINITIONS_DEBUG
"DEBUG;_DEBUG"
COMPILE_DEFINITIONS_RELEASE
"NDEBUG"
)
我个人更喜欢"旧"的方式,因为它取代了Visual Studio项目属性中的默认选项。无论通过target_compile_options()
传递的是什么,最终都会进入Configuration Properties / C/C++ / Command Line / Additional Options
。
一些你的第一个方法不工作的背景信息:
CMake的生成器接受在任何CMakeLists.txt
文件末尾为CMAKE_<LANG>_FLAGS
设置的任何内容,并在生成构建环境时将其作为默认编译器选项应用于相同CMakeLists.txt
文件中的所有库和可执行目标。
如果你在子目录CMakeLists.txt
中为你的CMakeLists.txt
目标设置链接器变量,它不会有帮助(错误的作用域)。如果我把上面的代码放到主CMakeLists.txt
中,它确实可以工作,并且我得到以下警告(因为您使用了链接器的编译器选项):
1>LINK : warning LNK4044: unrecognized option '/W3'; ignored
1>LINK : warning LNK4044: unrecognized option '/EHsc'; ignored
1>LINK : warning LNK4044: unrecognized option '/MTd'; ignored
1>LINK : warning LNK4044: unrecognized option '/Od'; ignored
1>LINK : warning LNK4044: unrecognized option '/Ob0'; ignored
1>LINK : warning LNK4044: unrecognized option '/Zi'; ignored
1>LINK : warning LNK4044: unrecognized option '/RTC1'; ignored
1>LINK : warning LNK4044: unrecognized option '/DDEBUG'; ignored
1>LINK : warning LNK4044: unrecognized option '/D_DEBUG'; ignored
我现在隐藏了CMake在编译器检测期间设置的同名缓存变量。详细信息请参见:
- CMake设置和使用变量的语法是什么?
- CMake:在哪个顺序是文件解析(缓存,工具链等)?
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中添加全局编译标志
- 如何在 clang 的自动会议中检查支持编译标志
- CMake:如何在Visual Studio环境中将依赖于模式的编译标志传递给nvcc
- 使用 -O1 优化标志编译项目时共享库崩溃
- Valgrind 标志,调试与发布编译
- CMake:替换接口目标的编译标志
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- 为什么在编译过程中尽管有 -I(破折号大写 i)标志,但仍会出现未定义的引用错误?
- 当自动编译对象文件时,如何使我的makefile使用我的cflags标志
- 使用 c++11 标志交叉编译 OpenWRT
- Unix 宏在使用 -std=c++0x 标志编译时变得未定义
- 使用 -O2 或 -O3 标志编译时未捕获异常
- 未使用调试器标志编译的代码出现分段错误
- 如何使用-g调试标志编译boost
- 在不同的编译单元中使用不同的编译标志编译相同的头
- GCC的调试标志(编译阶段/链接阶段)
- 是否有任何方法可以发现静态库是用-fPIC标志编译的?
- 使用-g gcc标志编译的程序比不使用-g编译的程序慢
- 使用c++0x标志编译wxWidgets