cmake脚本学习——持续更新

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")
相关推荐
程序员老陆2 小时前
CMake 常用关键字与命令全景:从 set到 target_link_options的现代工程视角
c++·cmake·程序开发
szephyr1 天前
用 Python 写自动化脚本:定时任务、文件批处理、自动出报表
python·自动化·pandas·脚本·定时任务
idealzouhu2 天前
现代 CMake 依赖管理详解:从构建树、Target 封装到 find_package 工作原理
c++·cmake
小王C语言5 天前
cmake教程
c++·cmake
2601_962299889 天前
Linux执行Python脚本方法
linux·python·脚本·解释器·shebang
DolphinDB12 天前
循环加速最高达 3 倍!DolphinDB 动态脚本优化免费开启,零代码改造即可投入生产
脚本·时序数据库·dolphindb
2601_9622953313 天前
使用python实现一个浏览器自动化的脚本
python·脚本·rpa·浏览器自动化·操作
雾里看山15 天前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
2601_9622998815 天前
Linux下运行Python脚本
linux·python·ubuntu·脚本·命令