Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.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 studio 2012 CMake-使用/MT而不是/MD编译_Visual Studio 2012_Cmake_Cpp Netlib - Fatal编程技术网

Visual studio 2012 CMake-使用/MT而不是/MD编译

Visual studio 2012 CMake-使用/MT而不是/MD编译,visual-studio-2012,cmake,cpp-netlib,Visual Studio 2012,Cmake,Cpp Netlib,我是cmake(2.8.12.1)的新手,我正在Windows上使用它生成项目文件,以使用Visual Studio 2012构建cpp netlib 默认情况下,它使用/MDd编译器开关进行编译。我想更改它,使其使用/MTd 我遵循了这里给出的建议,但它对我不起作用 具体来说,我将下面if语句中的第二行添加到了CmakeLists.txt if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") set(CMAKE_

我是cmake(2.8.12.1)的新手,我正在Windows上使用它生成项目文件,以使用Visual Studio 2012构建cpp netlib

默认情况下,它使用/MDd编译器开关进行编译。我想更改它,使其使用/MTd

我遵循了这里给出的建议,但它对我不起作用

具体来说,我将下面if语句中的第二行添加到了CmakeLists.txt

if (MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
当我打开Visual Studio sln文件时,我可以看到/MDd选项仍然处于设置状态。此外,我在cmakcache.txt中看到以下内容:

//Flags used by the compiler during debug builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
我也尝试过这样从头开始设置标志:

set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
-DCMAKE_CXX_FLAGS_DEBUG="/MTd"
但这也不行

如果我通过命令行传递选项,如下所示:

set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
-DCMAKE_CXX_FLAGS_DEBUG="/MTd"
已在Visual Studio项目中成功设置该选项

谁能告诉我我做错了什么

如果有人能告诉我缓存中的值来自何处,我将不胜感激,因为我没有在命令行中指定这些值,或者CmakeLists.txt中没有这些值

if (MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
根据请求添加CMakeList.txt。我以前从未发过帖子,所以如果我做得不对,我会向你道歉

# Original from cpp-netlib.org with my edits

cmake_minimum_required(VERSION 2.8)
project(CPP-NETLIB)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTI_THREADED ON)
find_package( Boost 1.45.0 REQUIRED unit_test_framework system regex date_time thread filesystem program_options chrono )
find_package( OpenSSL )
find_package( Threads )
set(CMAKE_VERBOSE_MAKEFILE true)

if (CMAKE_BUILD_TYPE MATCHES Debug)
    add_definitions(-DBOOST_NETWORK_DEBUG)
endif()

if (OPENSSL_FOUND)
    add_definitions(-DBOOST_NETWORK_ENABLE_HTTPS)
    include_directories(${OPENSSL_INCLUDE_DIR})
endif()

if (${CMAKE_CXX_COMPILER_ID} MATCHES GNU)
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()

if (Boost_FOUND)
    ################# added #################
    add_definitions(-DBOOST_ALL_NO_LIB)
    #########################################
    if (MSVC)
      add_definitions(-D_SCL_SECURE_NO_WARNINGS)
    endif(MSVC)
    if (WIN32)
      add_definitions(-D_WIN32_WINNT=0x0501)
    endif(WIN32)
    include_directories(${Boost_INCLUDE_DIRS})
    enable_testing()
    add_subdirectory(libs/network/src)
    add_subdirectory(libs/network/test)
    if (NOT MSVC)
      add_subdirectory(libs/mime/test)
    endif(NOT MSVC)
    add_subdirectory(libs/network/example)
endif(Boost_FOUND)

if (MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
    ################# added #################
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
    #########################################
endif()

enable_testing()

if
块中添加代码应该可以正常工作。但是,由于它不会在.sln中产生所需的效果,因此,if块中的代码未被执行,或者标志稍后在CMakeLists.txt中被替换

if (MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
这些标志的缓存值来自何处;CMake为每个默认生成类型应用并缓存被认为有用的默认值

您是否在呼叫前添加了对标志的更改<代码>项目设置了很多东西,包括编译器标志。如果在不缓存这些标志的情况下设置这些标志(即,如图所示调用
set
),
project
将覆盖它们。如果设置标志并缓存它们(例如,使用
set(…缓存)
,或通过命令行arg
-D
添加它们,如图所示),则
project
不会覆盖它们

另外,由于调用
set(CMAKE\u CXX\u FLAGS“${CMAKE\u CXX\u FLAGS}/bigobj”)
不使用,因此对变量
CMAKE\u CXX\u FLAGS
的更改不会出现在CMakeCache.txt文件中

为了将其放入缓存,您还必须使用
set
FORCE
选项,因为您会告诉CMake替换已缓存的值(默认情况下,CMake本身缓存这些标志变量)。但是,我不建议这样做-我不明白为什么需要这样做,最好寻找一种比附加所需的标志更好的方法,因为每次CMake运行时,附加的标志都会被重新附加

如果这不允许您解决问题,也许您可以显示一个完整(小)的CMakeLists.txt,其中显示了问题

更新:

好的-这是一个范围问题。对编译器标志的更改将应用于该CMakeLists.txt中定义的所有目标(EXE/LIB),但仅应用于修改标志后添加的子目录目标

该命令引入了一个新的作用域(尽管文档中没有提到),该作用域继承父变量的副本。但是,对父作用域中变量的后续更改不会影响子副本,同样,更改子副本也不会影响父副本的值(除非您使用
集(…父作用域)
强制它)


因此,要解决您的问题,只需将
if(MSVC)
块移动到所有
add_子目录
调用之前。

根据请求添加了CMakeLists.txt。
if
块中的代码肯定正在执行。是-发布完整的CMakeLists.txt帮助:-)希望我的更新能解决这个问题。非常感谢@Fraser的帮助。在按照建议修改CMakeLists.txt后,我能够构建解决方案。