You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:11:28