相关疑难解决方法(0)

CMake:在脚本中打印出所有可访问的变量

我想知道是否有办法在CMake中打印出所有可访问的变量.我对CMake变量不感兴趣 - 就像在--help-variables选项中一样.我在谈论我定义的变量,或者包含脚本定义的变量.

我现在包括

INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake)
Run Code Online (Sandbox Code Playgroud)

而且我希望我能打印出这里的所有变量,而不是必须浏览所有文件并阅读可用的内容 - 我可能会发现一些我不知道的变量可能有用.帮助学习和发现会很好.它严格用于调试/开发.

这类似于打印Lua中当前作用域可访问的所有局部变量中的问题,但对于CMake!

有没有人这样做过?

cmake

199
推荐指数
4
解决办法
12万
查看次数

在CMake中设置MSVC运行时

我按照CMake FAQ条目"如何使用静态运行时构建我的MSVC应用程序?"中的说明进行操作.集中选择一组嵌套的CMake项目的MSVC运行时(它们作为Git子模块引入并使用CMake find_package()指令添加到主项目中).

所以,我写了这个CMake宏:

macro(configure_msvc_runtime)
  if(MSVC)

    # Default to statically-linked runtime.
    if("${MSVC_RUNTIME}" STREQUAL "")
      set(MSVC_RUNTIME "static")
    endif()

    # Set compiler options.
    set(variables
      CMAKE_C_FLAGS_DEBUG
      CMAKE_C_FLAGS_MINSIZEREL
      CMAKE_C_FLAGS_RELEASE
      CMAKE_C_FLAGS_RELWITHDEBINFO
      CMAKE_CXX_FLAGS_DEBUG
      CMAKE_CXX_FLAGS_MINSIZEREL
      CMAKE_CXX_FLAGS_RELEASE
      CMAKE_CXX_FLAGS_RELWITHDEBINFO
    )
    if(${MSVC_RUNTIME} STREQUAL "static")
      message(STATUS
        "MSVC -> forcing use of statically-linked runtime."
      )
      foreach(variable ${variables})
        if(${variable} MATCHES "/MD")
          string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
        endif()
      endforeach()
    else()
      message(STATUS
        "MSVC -> forcing use of dynamically-linked runtime."
      )
      foreach(variable ${variables})
        if(${variable} MATCHES "/MT")
          string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}") …
Run Code Online (Sandbox Code Playgroud)

cmake visual-studio

38
推荐指数
4
解决办法
3万
查看次数

CMake 用 /MTd 覆盖我的 /MDd 标志

我在 stackoverflow 上读过类似的问题,但没有一个答案能解决我的问题。

我需要使用/MDd标志进行编译,这是我的 CMake 命令:(注意粗体/MDd标志)

cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=C:/temp -DCMAKE_C_FLAGS="-Zi -W4 -WX- -Od -Oy- -D_WIN32 -DWIN32=1 -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -D_CRT_SECURE_NO_WARNINGS=1 -D_SCL_SECURE_NO_警告=1 -D_MBCS -GF- -Gm -EHsc -RTCc -RTC1 -MDd -GS -Gy- -Qpar- -fp:精确 -fp:除了 -Zc:wchar_t -Zc:forScope -GR -Gd -analyze- -errorReport :迅速的”

这是执行nmake时的输出:

cl : Command line warning D9025 : overriding '/MDd' with '/MTd'
cl : Command line warning D9025 : overriding '/W4' with '/W3'
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我在这里做错了什么吗?

msbuild compilation build cmake

6
推荐指数
1
解决办法
8004
查看次数

CMake - 用/ MT而不是/ MD编译

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

默认情况下,它使用/ MDd编译器开关进行编译.我想改变它,以便它使用/ MTd.

我按照这里给出的建议/sf/answers/992101001/但它不适合我.

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

if (MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()
Run Code Online (Sandbox Code Playgroud)

当我打开Visual Studio sln文件时,我可以看到仍然设置了/ MDd选项.此外,我在CMakeCache.txt中看到以下内容:

//Flags used by the compiler during debug builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=/D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
Run Code Online (Sandbox Code Playgroud)

我也尝试过像这样设置标志:

set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

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

-DCMAKE_CXX_FLAGS_DEBUG="/MTd"
Run Code Online (Sandbox Code Playgroud)

该选项已在Visual Studio项目中成功设置.

谁能告诉我我做错了什么?

如果有人可以告诉我缓存中的值来自于我未在命令行中指定或不在CmakeLists.txt中的位置,我也将不胜感激.

根据请求添加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 …
Run Code Online (Sandbox Code Playgroud)

cmake cpp-netlib visual-studio-2012

3
推荐指数
1
解决办法
1万
查看次数

CMake(Ninja 后端)使用 /MT 编译

我有一个与此CMake 编译类似的问题,使用 /MT 而不是 /MD但有一些差异:

我正在使用 Visual Studio 2017 使用 CMake 和 Ninja 生成器构建一个库。Visual Studio 为我提供了一些选择(配置),例如 x86-Debug 等。还有一个 CMakeSettings.json 文件,似乎我可以通过它来操作 Visual Studio 的默认配置。但我不知道怎么做!

我想用 /MT 编译我的库,但我不想像上面的帖子那样在 CMakeLists.txt 文件中对其进行硬编码。这意味着我想根据用户选择通过配置来编译我的库。

CMakeSettings.json 文件中是否有任何变量可以帮助我定义 /MT 编译器开关?图书馆的静态/动态建设怎么样?有关于此文件的任何帮助吗?

c++ cmake ninja visual-studio-2017

3
推荐指数
1
解决办法
973
查看次数