CMake 3.15及以后版本增加了CMAKE_MSVC_RUNTIME_LIBRARY的选项,用于设置MSVC运行库,但是试了N边都是不起作用,Google了一堆也就发现几篇文章讲这个问题的,关键他们居然都成功了!实在想不通,把CMakeLists.txt文件翻来覆去的看也没发现问题,最后终于搜到一个相关链接:
http://www.open3d.org/docs/latest/_downloads/fec171dc63cc69d958f5cc1bb06b6c9c/CMakeLists.txt
这个CMakeLists.txt文件中也设置了CMAKE_MSVC_RUNTIME_LIBRARY选项,对比了发现了问题,他的CMAKE_MSVC_RUNTIME_LIBRARY的选项是在project之前设置的!难道。。。我赶紧修改下我的CMakeLists.txt文件,一试果然成功了!下面贴下我的CMakeLists.txt文件中相关设置:
option(MSVC_STATIC_RUNTIME "Build static runtime" OFF)
# The CMAKE_<LANG>_FLAGS(_<BUILD_TYPE>)? is meant to be user controlled.
# Prior to CMake 3.15, the MSVC runtime library was pushed into the same flags
# making programmatic control difficult. Prefer the functionality in newer
# CMake versions when available.
if(${CMAKE_VERSION} VERSION_GREATER 3.15 OR ${CMAKE_VERSION} VERSION_EQUAL 3.15)
if (MSVC_STATIC_RUNTIME)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()
message(STATUS "CMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}")
else()
# In case we are building static libraries, link also the runtime library statically
# so that MSVCR*.DLL is not required at runtime.
# https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
# This is achieved by replacing msvc option /MD with /MT and /MDd with /MTd
# http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F
if (MSVC AND MSVC_STATIC_RUNTIME)
message(STATUS "MSVC_STATIC_RUNTIME on")
set(CompilerFlags
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELWITHDEBINFO
)
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")
endforeach(flag_var)
endif()
endif()
if(MSVC)
add_definitions(-DUNICODE -D_UNICODE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251")
endif()
set(PROJECT_NAME "WinPipe")
project(${PROJECT_NAME} CXX)