1.cmake查看版本
bash
cmake --version
2.CMake Error at CMakeLists.txt:3 (PROJECT):
Generator
Visual Studio 15 2017
could not find any instance of Visual Studio.
-- Configuring incomplete, errors occurred!
CMake Error:
Generator
Visual Studio 15 2017
could not find any instance of Visual Studio.
报错的核心意思是:CMake 想用 Visual Studio 2017 的编译器来生成工程文件,但在你的电脑上找不到任何已安装的 Visual Studio 2017 实例。
常见原因与解决方向
通常由以下情况引发,你可以对照排查:
版本不匹配:你实际安装的 VS 版本与命令指定的不一致。例如,装了 VS 2019,却用 -G "Visual Studio 15 2017" 去生成。
组件缺失:即使版本对了,如果安装 VS 时没有勾选 "使用 C++ 的桌面开发" 工作负载,CMake 也无法识别到编译器。
环境未就绪:VS 安装后未重启,或环境变量(如 VS150COMNTOOLS)未正确设置,导致 CMake 扫描不到。
3.CMake Error: Error: generator : Visual Studio 18 2026
Does not match the generator used previously: Visual Studio 15 2017
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.
CMake Error:
Generator
Visual Studio 15 2017
could not find any instance of Visual Studio.解释一下
这个报错由两个叠加的问题造成,核心是:你在同一个 build 目录里,先用 VS 2017 生成器配置过,现在想换成 VS 2026,CMake 检测到冲突并拒绝继续。
第一段:生成器冲突
Error: generator : Visual Studio 18 2026
Does not match the generator used previously: Visual Studio 15 2017
CMake 在第一次配置时会往 build/CMakeCache.txt 里写入所用生成器(这里是 VS 2017)。第二次你指定 VS 2026,CMake 发现和缓存里的不一致,就报错。一个 build 目录只能绑定一个生成器,不能中途换。
后面那句提示就是解决办法:
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.
要么删缓存,要么换一个新目录。
第二段:VS 2017 找不到
Generator Visual Studio 15 2017 could not find any instance of Visual Studio.
这条是旧缓存遗留导致的。因为冲突报错,CMake 回退去读旧的缓存,而缓存里写的是 VS 2017------你机器上并没有装 VS 2017,于是又报了找不到实例。
也就是说,第二条错误只是第一条的"副产品",根源还是缓存没清。
解决办法
方法一:清掉旧缓存(推荐)
方法二:换一个新的 build 目录
4.在编译时自动把依赖的 DLL 文件复制到生成可执行文件(.exe)的同一个文件夹里
bash
//方案一
# 将可执行文件依赖的运行时 DLL 自动复制到它所在的目录
add_custom_command(TARGET <tarName> POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_RUNTIME_DLLS:<tarName>> # 自动收集依赖的 DLL
$<TARGET_FILE_DIR:<tarName>> # 目标目录:可执行文件所在目录
COMMAND_EXPAND_LISTS
)
方案二
# 假设 bsoncxx 的 DLL 在一个已知目录里,比如 ${BSONCXX_ROOT}/bin
# 如果不知道具体路径,可以先用 find_library 等命令找到它
add_custom_command(TARGET <tarName> POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"你的/bsoncxx/路径/xxxx.dll" # 要复制的文件
"$<TARGET_FILE_DIR:<tarName>>" # 目标目录
)
5.判断文件是否存在
bash
//EXISTS 对文件和目录都返回真,不区分类型。
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/config.ini")
message(STATUS "文件存在")
else()
message(STATUS "文件不存在")
endif()
6.判断是否为目录
bash
if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/assets")
message(STATUS "是目录")
endif()
7.判断是否为文件
bash
if(EXISTS "${path}" AND NOT IS_DIRECTORY "${path}")
message(STATUS "是文件")
endif()
8.自动建多级父目录的宏
bash
//会自动判断存在则更新
macro(mymkdir)
file(MAKE_DIRECTORY ${ARGN})
endmacro()
//使用
mymkdir("${OUTPUT_BINDIR}" "${CMAKE_BINARY_DIR}/cache")