C++ CMAKE-设置库的编译标志
我有一个CMakeLists.txt脚本来编译我的库。 问题是我无法设置库的编译标志 我试过了C++ CMAKE-设置库的编译标志,c++,cmake,libraries,flags,C++,Cmake,Libraries,Flags,我有一个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_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")
这将更改调试和发布的标志
我该如何使用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>"
)
我个人喜欢“旧”的方法来做得更好,因为它取代了VisualStudio项目属性中的默认选项。通过target\u compile\u options()
传递的任何内容都将在Configuration Properties/C/C++/命令行/Additional options
中结束
一些您的第一种方法不起作用的背景信息:
CMake的生成器将在任何CMakeLists.txt
文件末尾为CMake\uu标志设置的内容作为生成生成环境时的默认编译器选项,应用于同一CMakeLists.txt
文件中的所有库和可执行目标
如果为子目录CMakeLists.txt
中的mainCMakeLists.txt
目标设置链接器变量,则不会有帮助(范围错误)。如果我将上面的代码放入主CMakeLists.txt
中,它确实有效,我会收到以下警告(因为您使用了链接器的编译器选项):
我现在隐藏了CMake在编译器检测期间设置的同名缓存变量。有关更多详细信息,请参阅:
回答得很好,谢谢你的推荐。我相信中支持带有生成器的target_compile_选项。我必须删除生成器示例中的引号,才能在GCC 9.2中使用。
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"
)
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