CMAKE - 为库设置编译标志

时间:2015-07-24 23:07:45

标签: 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_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标志?

1 个答案:

答案 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设置的同名缓存变量。有关详细信息,请参阅: