我第一次在VS2019中尝试CMake,但对它的工作方式感到困惑。这是在Windows 10中使用的msvc_x64_x64工具集。
我有一个创建静态库的CMake项目,我想使用动态链接。默认的CMakeSettings.json包括变量
CMAKE_CXX_FLAG_DEBUG=/MDd/Zi/Ob0/Od/RTC1
txt不会覆盖这一点,所以它对我来说很好
然而,生成的lib文件似乎使用静态链接,另一个项目可以使用运行库/MTd而不是/MDd链接到它。
因此,它似乎是从其他地方获取编译器标志,而忽略了CMakeSettings.json中的标志,或者存在CMAKE_CXX_flags_DEBUG以外的其他变量。
如何使用CMakeSettings.json变量?
这是当前的CMakeSettings.json文件
{
"configurations": [
{
"name": "x64-Debug",
"generator": "Visual Studio 16 2019 Win64",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\out\build\${name}",
"installRoot": "${projectDir}\out\install\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"variables": [
{
"name": "CMAKE_CXX_FLAGS_DEBUG",
"value": "/MDd /Zi /Ob0 /Od /RTC1",
"type": "STRING"
}
]
},
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"buildRoot": "${projectDir}\out\build\${name}",
"installRoot": "${projectDir}\out\install\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "msvc_x64_x64" ],
"variables": []
}
]
}
找到了!
该库包含来自GoogleTest的文件,并且有一个文件internal_utils.cmake包含行
string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
因此,CMakeSettings.json变量在使用之前就被覆盖了。
添加CMake命令参数
-Dgtest_force_shared_crt=ON
说服它停止。
谢谢你的帮助。
请注意,在VS2019中,正确的方法是使用CMakePresets.json。不推荐使用CMakeSettings.json。要启用对它们的支持,需要启用一个选项。查看此链接https://learn.microsoft.com/en-us/cpp/build/cmake-presets-vs?view=msvc-160了解更多信息。