【问题标题】:How to change Visual Studio CMake run-time library如何更改 Visual Studio CMake 运行时库
【发布时间】:2018-05-12 22:41:48
【问题描述】:

我目前正在尝试使用 Visual Studio 2017 Version 15.7.0 编译一些代码,但在更改运行时库时遇到问题。我知道有类似的问题,您通常会右键单击项目,然后通过出现的用户界面进行更改;但是,由于我使用的是 CMake,因此无法使用该用户界面,因为该用户界面没有出现。

Visual Studios 当前默认设置为使用/MD 运行时库,我想使用/MT。我尝试在顶层CMakeLists.txt 中设置此变量,但它似乎被覆盖了。我发现我可以成功构建项目的唯一方法是更改​​CMakeCache.txt/MD 的所有实例。虽然这是一个临时 hack,但我想知道这个变量的正确设置是什么,以便 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)

【问题讨论】:

    标签: visual-studio cmake


    【解决方案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 )
    

    【讨论】:

      【解决方案2】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 2018-09-10
        • 1970-01-01
        相关资源
        最近更新 更多