我想知道是否有办法在CMake中打印出所有可访问的变量.我对CMake变量不感兴趣 - 就像在--help-variables选项中一样.我在谈论我定义的变量,或者包含脚本定义的变量.
我现在包括
INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake)
Run Code Online (Sandbox Code Playgroud)
而且我希望我能打印出这里的所有变量,而不是必须浏览所有文件并阅读可用的内容 - 我可能会发现一些我不知道的变量可能有用.帮助学习和发现会很好.它严格用于调试/开发.
这类似于打印Lua中当前作用域可访问的所有局部变量中的问题,但对于CMake!
有没有人这样做过?
我按照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) 我在 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时的输出:
Run Code Online (Sandbox Code Playgroud)cl : Command line warning D9025 : overriding '/MDd' with '/MTd' cl : Command line warning D9025 : overriding '/W4' with '/W3'
有人可以告诉我我在这里做错了什么吗?
我是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 编译类似的问题,使用 /MT 而不是 /MD但有一些差异:
我正在使用 Visual Studio 2017 使用 CMake 和 Ninja 生成器构建一个库。Visual Studio 为我提供了一些选择(配置),例如 x86-Debug 等。还有一个 CMakeSettings.json 文件,似乎我可以通过它来操作 Visual Studio 的默认配置。但我不知道怎么做!
我想用 /MT 编译我的库,但我不想像上面的帖子那样在 CMakeLists.txt 文件中对其进行硬编码。这意味着我想根据用户选择通过配置来编译我的库。
CMakeSettings.json 文件中是否有任何变量可以帮助我定义 /MT 编译器开关?图书馆的静态/动态建设怎么样?有关于此文件的任何帮助吗?