【问题标题】:Is it possible, in the same CMakeLists.txt, to setup projects with /MT and others with /MD?是否可以在同一个 CMakeLists.txt 中使用 /MT 设置项目,而使用 /MD 设置其他项目?
【发布时间】:2013-08-05 18:37:57
【问题描述】:

我有一个项目,为此我创建了库的静态和动态版本。这些工具与静态版本链接,因此不需要特殊的 DLL 即可在最终系统上运行它们。

我可以通过根 CMakeLists.txt 中的一个简单设置,将所有内容设置为使用 /MD/MT(以及相应的调试)进行编译。

例如,要强制 /MT,我可以使用以下命令:

set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" )
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd" )

然而,这意味着动态库是用/MT 编译的,这是错误的。是否可以在每个项目的基础上做同样的事情?毕竟,一旦创建了解决方案,我就可以编辑每个项目并将/MD/MT 对象修复为我需要的对象。 cmake 可以做到吗?会很方便的。

我查看了set_target_properties(),但它似乎没有使用CMAKE_C_FLAGS_<type> 变量,如果我只是设置一组标准标志,它不会特定于调试或发布。

以下确实设置了属性,但我似乎没有调试和发布选项的选择。

set_target_properties( ${PROJECT_NAME} PROPERTIES
    COMPILE_FLAGS "/MT"
)

有什么办法吗?

【问题讨论】:

    标签: dll visual-studio-2012 static cmake


    【解决方案1】:

    好吧!我搞定了!

    我发现这个问题有一个糟糕的解决方案,将库分成两个目录并在每个目录中都有 set() 。这会奏效,但工作量会很大。

    How can I set specific compiler flags for a specific target in a specific build configuration using CMake?

    该解决方案有一条评论,其中包含指向此问题的链接:

    http://public.kitware.com/Bug/view.php?id=6493

    实际上只是在 2013-06-03 12:52 标记为已修复!这意味着该解决方案在最新的稳定版本的 cmake 中尚不可用。然而,Brad King 和 Stepen Kelly 所做的工作确实很好。它可以从这里找到的每日构建中下载:

    http://www.cmake.org/files/dev/?C=M;O=D

    新命令的使用方式有点棘手,有我写的:

    function(StaticCompile)
        target_compile_options( ${PROJECT_NAME}
            PUBLIC "/MT$<$<STREQUAL:$<CONFIGURATION>,Debug>:d>"
        )
    endfunction()
    

    英文意思是:如果字符串“$”等于“Debug”,则在“/MT”后面输出“d”,否则什么也不输出。

    然后,在任何需要使用 /MT 或 /MTd 编译的目标的地方,我都会使用以下命令:

    project(wpkg)
    
    add_executable( ${PROJECT_NAME}
        wpkg.cpp
        license.cpp
    )
    
    StaticCompile()
    

    结果完全符合预期,没有任何目录或其他技巧!

    它适用于我今天可用的版本 cmake-2.8.11.20130803-gd5dc2-win32-x86.exe。真的很酷! 8-)

    【讨论】:

    • 不要使用STREQUAL。请改用 CONFIG 生成器表达式。
    • 你敢用这个所谓的“配置生成器”来回答吗?
    • @AlexisWilke,见cmake.org/cmake/help/v3.0/manual/…中的$
    • 应该类似于"/MT$&lt;$&lt;CONFIG:DEBUG&gt;:d&gt;"(警告:未经测试)
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多