我有一个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为库分别设置Release和Debug标志?
答案 0 :(得分:9)
这些是您在第一种方法中尝试覆盖的全局缓存变量。
在本地更改这些编译器/链接器选项,您需要特定于配置的目标属性或generator expressions。所以采取你的第二种方法How can I set specific compiler flags for a specific target in a specific build configuration using 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版本&lt; = 2.8.12(另见policy 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"
)
我个人喜欢&#34; OLD&#34;这样做的方法更好,因为它取代了Visual Studio的项目属性中的默认选项。无论通过target_compile_options()
传递的是什么,都会以Configuration Properties / C/C++ / Command Line / Additional Options
结尾。
您的第一种方法无效的一些背景信息:
CMake的生成器在任何CMAKE_<LANG>_FLAGS
文件的末尾接受为CMakeLists.txt
设置的任何内容,并将其应用于与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
中它确实有效,我得到以下警告(因为你使用了链接器的编译器选项):
function generate_barcode()
{
$barcode = rand(1,10);
$bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
if($bquery==1)
{
return generate_barcode(); // changed!
}
else
{
return $barcode;
}
}
我现在隐藏了在编译器检测期间由CMake设置的同名缓存变量。有关详细信息,请参阅: