Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ CMake、Microsoft Visual Studio和单片运行时 我使用CMASTE构建系统和微软的Visual C++编译器构建文件。当我让CMake生成visual studio项目时,该项目包含用于构建“多线程DLL”类型的运行时的命令行,该运行时依赖于msvcrt.DLL。由于各种原因,我现在不打算讨论,我不能依赖msvcrt_Visual C++_Cmake - Fatal编程技术网

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

Visual c++ CMake、Microsoft Visual Studio和单片运行时 我使用CMASTE构建系统和微软的Visual C++编译器构建文件。当我让CMake生成visual studio项目时,该项目包含用于构建“多线程DLL”类型的运行时的命令行,该运行时依赖于msvcrt.DLL。由于各种原因,我现在不打算讨论,我不能依赖msvcrt,visual-c++,cmake,Visual C++,Cmake,有没有办法告诉CMake在其构建过程中修改此选项?我使用以下代码链接到静态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

有没有办法告诉CMake在其构建过程中修改此选项?

我使用以下代码链接到静态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)

我将动态标志(/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()

这太过分了,不是吗?“foreach()string(replace,/md,/mt)endforeach()”不也同样有效吗?(即去掉if()和/MDd)。不管怎样,第一个替换将与第二个匹配,在您进行替换之前搜索匹配项是没有意义的。对于我来说,在foreach(flag\u var…)
string(REGEX replace)/MD”“/MT“${flag\u var}”${${flag\u var}”)
中记录了执行此操作的选项“如何使用静态运行时构建MSVC应用程序“在更正确的官方文档链接中,如何使用MSVC构建与CRT的静态链接:我在实现这一点时遇到了一些问题。不管我把它放在哪里,最终得到的项目仍然使用/MD或/MDd。我最终意识到根本没有设置/MD或/MT标志,它默认为/MD。。。代码的字符串(CONCAT…)部分修复了我的问题。