VS Code中点击CMake启动目标时Debug目录.dll文件被删除的解决方法
问题场景
在VS Code中配置vcpkg+CMake+MSVC环境,按官方流程操作后出现异常:首次通过CMake状态栏「Launch」启动目标程序正常,但修改少量代码后二次启动失败。排查发现:首次构建完成后,Debug目录下同时存在main.exe和sqlite3.dll文件,直接运行main.exe可正常工作;但通过CMake重新构建后点击「Launch Target」时,sqlite3.dll会被自动删除,只能通过清理整个项目后重新构建才能恢复该文件。需要解决的问题是:阻止VS Code中点击CMake状态栏Launch按钮时删除Debug目录下的sqlite3.dll文件。
解决方案
方法1:启用vcpkg自动复制DLL功能(推荐)
vcpkg自带自动复制依赖DLL到输出目录的逻辑,之前的配置未触发该功能是因为工具链文件的位置设置错误。修改CMakeLists.txt,将CMAKE_TOOLCHAIN_FILE的设置移到project()命令之前:
cmake_minimum_required(VERSION 3.0) # 必须在project()之前设置工具链文件,否则vcpkg的自动复制逻辑不生效 set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") project(test) find_package(unofficial-sqlite3 CONFIG REQUIRED) add_executable(test main.cpp) target_link_libraries(test PRIVATE unofficial::sqlite3::sqlite3)
修改后,每次构建时vcpkg会自动将依赖的sqlite3.dll复制到输出目录,且不会被Launch流程误删。
方法2:手动添加DLL复制规则
如果方法1无法生效,可直接在CMake中添加自定义命令,强制将sqlite3.dll复制到输出目录:
cmake_minimum_required(VERSION 3.0) project(test) set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake") set(unofficial-sqlite3_DIR "C:/vcpkg/packages/sqlite3_x64-windows/share/unofficial-sqlite3") find_package(unofficial-sqlite3 CONFIG REQUIRED) add_executable(test main.cpp) target_link_libraries(test PRIVATE unofficial::sqlite3::sqlite3) # 构建完成后自动复制sqlite3.dll到输出目录 add_custom_command(TARGET test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE_DIR:unofficial::sqlite3::sqlite3>/sqlite3.dll" $<TARGET_FILE_DIR:test> )
该命令会在每次构建结束后,检查vcpkg安装目录下的sqlite3.dll,如果和输出目录中的文件不同(或不存在),就自动复制过去,从根源上避免DLL被删除后无法恢复的问题。
方法3:检查VS Code CMake扩展配置
打开VS Code设置(快捷键Ctrl+,),搜索以下配置项进行检查:
CMake: Launch Args:确保没有添加会清理输出目录的参数CMake: Build Directory:确认构建目录设置正确,避免输出目录被意外覆盖
原始项目文件
CMakeLists.txt
# CMakeLists.txt cmake_minimum_required(VERSION 3.0) project(test) # Set the path to the toolchain file set(CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake") set(unofficial-sqlite3_DIR "C:/vcpkg/packages/sqlite3_x64-windows/share/unofficial-sqlite3") find_package(unofficial-sqlite3 CONFIG REQUIRED) add_executable(test main.cpp) target_link_libraries(test PRIVATE unofficial::sqlite3::sqlite3)
main.cpp
// main.cpp #include <sqlite3.h> #include <stdio.h> #include <iostream> int main(){ std::cout << sqlite3_libversion() << std::endl; std::cout << "Hello, World" << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者creataur
相关产品推荐
相关产品推荐

