我目前正在尝试使用Visual Studio 2017 Version 15.7.0
编译一些代码,并且在更改运行时库时遇到问题。我知道有类似的问题,你通常会右键点击项目,然后通过出现的用户界面进行更改;但是,由于我使用的是CMake,因此不会显示用户界面。
Visual Studio的当前默认设置设置为使用/MD
运行时库,我想使用/MT
。我已经尝试在顶级CMakeLists.txt
中设置此变量,但它似乎被覆盖了。我发现可以成功构建项目的唯一方法是更改/MD
中CMakeCache.txt
的所有实例。虽然这是一个临时的黑客,但我想知道这个变量的正确设置是什么,以便Visual Studio在编译时使用/MT
。
我已尝试过此前的答案link,但我没有让它发挥作用。这是我目前的最高级CMakeLists.txt
。
cmake_minimum_required (VERSION 3.11)
project ("WindowCMakeProject")
message(STATUS "Using CMake Version " ${CMAKE_VERSION})
#This project heavily uses C++ 17
set (CMAKE_CXX_STANDARD 17)
#Setup Boost
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
if ( WIN32 )
add_definitions( -DBOOST_ALL_NO_LIB )
set(Boost_USE_STATIC_RUNTIME ON)
#Solution from prior answer doesn't work
set(CMAKE_CXX_FLAGS_RELEASE "/MT")
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
endif()
find_package(Boost 1.66.0 REQUIRED COMPONENTS system)
#Setup OpenSSL
find_package(OpenSSL REQUIRED)
#Setup Google Protobuf
find_package(Protobuf REQUIRED)
if ( DEBUG_PRINT )
set(DEBUG_PRINT_MODE 1)
else()
set(DEBUG_PRINT_MODE 0)
endif()
#Add Util Headers
add_subdirectory(Utils)
set (UTILS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utils/include)
#Setup Server Library
set (SERVER_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/ServerLibrary/include)
add_subdirectory (ServerLibrary)
include_directories(${SERVER_INCLUDE_DIRS})
#Setup Message Helper Library
set (MESSAGE_HELPER_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MessageHelperLibrary/include)
add_subdirectory(MessageHelperLibrary)
include_directories(${MESSAGE_HELPER_INCLUDE_DIR})
#Setup Protobufs(These are built by CMake)
add_subdirectory(ProtoFiles)
set (PROTOBUF_MESSAGE_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/ProtoFiles)
add_subdirectory (ExchangeHandlerServer)
add_subdirectory (TestServer)
add_subdirectory (TestClient)
答案 0 :(得分:1)
不确定是否有更好的方法,但这是我修复它的方式,
if ( MSVC )
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
set(CMAKE_CXX_FLAGS_MINSIZEREL ${CMAKE_CXX_FLAGS_MINSIZEREL})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}_INIT")
set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
set(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
set(CMAKE_C_FLAGS_MINSIZEREL ${CMAKE_C_FLAGS_MINSIZEREL})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
set(CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
set(CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
endif ( MSVC )
答案 1 :(得分:0)
If (MSVC)
Message ( STATUS "Setting MSVC switches")
string(REPLACE "/MTd" "/MDd" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "/MT" "/MD" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}_INIT")
set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
Endif (MSVC)