【问题标题】:CMake, Microsoft Visual Studio, and Monolithic RuntimesCMake、Microsoft Visual Studio 和单体运行时
【发布时间】:2010-12-09 18:55:36
【问题描述】:

我正在使用 CMake 构建系统和 Microsoft 的 Visual C++ 编译器构建一个文件。当我让 CMake 生成 Visual Studio 项目时,该项目包含用于构建“多线程 DLL”类型的运行时的命令行——它依赖于 msvcrt.dll。由于各种原因,我现在不打算讨论,我不能依赖 msvcrt。

有没有办法告诉 CMake 在它的构建过程中修改这个选项?

【问题讨论】:

    标签: visual-c++ cmake


    【解决方案1】:

    我使用以下代码链接到静态 CRT:

    if(MSVC)
    # We statically link to reduce dependencies
    foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
        if(${flag_var} MATCHES "/MD")
            string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
        endif(${flag_var} MATCHES "/MD")
        if(${flag_var} MATCHES "/MDd")
            string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
        endif(${flag_var} MATCHES "/MDd")
    endforeach(flag_var)
    endif(MSVC)
    

    【讨论】:

    • 这太过分了吧? “foreach() string(replace, /md, /mt) endforeach()” 不是也能正常工作吗? (即去掉 if() 和 /MDd)。无论如何,第一个替换将匹配第二个替换,在您进行替换之前搜索匹配是没有意义的。
    • 为我工作,在 foreach(flag_var...) 内部:string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
    • 执行此操作的选项记录在“如何使用静态运行时构建我的 MSVC 应用程序”下cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees
    • 更正确的官方文档链接如何使用 MSVC 与 CRT 的静态链接进行构建:cmake.org/Wiki/…
    • 我在实现这一点时遇到了一些麻烦。无论我把它放在哪里,最终的项目最终仍然使用 /MD 或 /MDd。我最终意识到 /MD 或 /MT 标志根本没有设置,它默认为 /MD。在代码中添加 else ... string(CONCAT ...) 部分解决了我的问题。
    【解决方案2】:

    我将动态标志(/MD 和 /MDd)替换为静态标志(/MT 和 /MTd)。另外,我发现我需要缓存标志变量才能使其保持不变。

    if(MSVC)
        foreach(flag_var CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
            string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
            string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
        endforeach(flag_var)
        SET (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "MSVC C Debug MT flags " FORCE)    
        SET (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "MSVC CXX Debug MT flags " FORCE)
        SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "MSVC C Release MT flags " FORCE)
        SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "MSVC CXX Release MT flags " FORCE)
        SET (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}" CACHE STRING "MSVC C Debug MT flags " FORCE)    
        SET (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}" CACHE STRING "MSVC C Release MT flags " FORCE)
        SET (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" CACHE STRING "MSVC CXX Debug MT flags " FORCE)    
        SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" CACHE STRING "MSVC CXX Release MT flags " FORCE)
    endif()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多