我正在使用CMake Build System和Microsoft的Visual C++编译器构建一个文件。当我有CMake生成Visual Studio项目时,该项目包含命令行来构建“多线程DLL”类型的运行时 - 依赖于msvcrt.dll。由于各种原因,我现在不进入,我不能依靠msvcrt。CMake,Microsoft Visual Studio和Monolithic Runtimes
有没有办法告诉CMake在它的构建过程中修改这个选项?
我正在使用CMake Build System和Microsoft的Visual C++编译器构建一个文件。当我有CMake生成Visual Studio项目时,该项目包含命令行来构建“多线程DLL”类型的运行时 - 依赖于msvcrt.dll。由于各种原因,我现在不进入,我不能依靠msvcrt。CMake,Microsoft Visual Studio和Monolithic Runtimes
有没有办法告诉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)
我静态标志(/ MT和/ MTD)代替动态标志(/ MD和/ MDD)。另外,我发现我需要缓存标志变量才能使其粘住。
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()字符串(替换,/ md,/ mt)endforeach()”工作吗? (即摆脱if()和/ MDd)。无论如何,第一个替换将会与第二个替换相匹配,并且在您进行替换之前没有任何一点搜索匹配。 – brofield 2010-03-27 23:25:59
适用于我,在foreach(flag_var ...)中: 'string(REGEX REPLACE“/ MD”“/ MT”$ {flag_var}“$ {$ {flag_var}}”)' – 2011-07-27 20:09:17
执行此操作的选项在http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees – javacavaj 2014-09-04 20:03:15