如何告诉VSCode在调试c++代码时加载我的共享dll



我在使用MinGW的Windows下用CMake编写了一个C++项目。我的项目结构如下:

.
├── CMakeLists.txt
├── CMakeSettings.json
├── libs
│   ├── CMakeLists.txt
│   └── CRCROMGen
│       ├── various .c / .h files
├── src
│   ├── CMakeLists.txt
│   ├── crc.c
│   └── crc.h
├── test
   ├── CMakeLists.txt
   ├── crc_test.cpp
   └── main.cpp

本质上,libs文件夹生成一个静态.a库,我将其用作依赖项,将src文件夹中的源代码编译为dll:

ADD_DEFINITIONS(-DBUILD_CRC_DLL)
ADD_LIBRARY(crc SHARED "")
TARGET_SOURCES(
crc
PRIVATE 
crc.c
PUBLIC
${CMAKE_CURRENT_LIST_DIR}/crc.h
)
TARGET_LINK_LIBRARIES(crc
crcromgen
)
TARGET_INCLUDE_DIRECTORIES(
crc
PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)
INSTALL(TARGETS crc DESTINATION "bin")

在构建过程中,dll在build/src/文件夹中生成。

现在,我的测试配置如下:

FILE(GLOB SRCS *.cpp)
ADD_EXECUTABLE(testcrc ${SRCS})
TARGET_LINK_LIBRARIES(testcrc
crcromgen
crc
GTest::GTest
GTest::Main
)
ADD_TEST(NAME testcrc COMMAND testcrc)
INSTALL(TARGETS testcrc DESTINATION "bin")

特别是,它们使用了crcDLL。

如果我将DLL从build/src文件夹复制到build/test文件夹中,那么我的测试运行良好。如果我不这样做,那么我的测试就会失败,因为他们找不到libcrc.dll

我试过很多东西:

  1. launch.json文件中设置additionalSOLibSearchPath
  2. launch.json文件中设置一个特殊的setupCommand,例如"text": "set env PATH=${PATH}:${workspaceFolder}/build/src"
  3. launch.json文件中设置PATH变量
"environment": [{
"name": "PATH",
"value": "${workspaceFolder}/build/src"
}],

除了手动将dll复制到build/test文件夹之外,什么都不起作用。

有没有办法在没有那本手册的情况下做到这一点?我希望visual studio代码调试器在build/src位置查找dll并成功运行测试。

编辑

您可以在此处找到示例回购:https://github.com/zadigus/cmake-cpp-gtest.在回购中,您需要更改两个参数以适应您的本地环境:

  1. launch.json中,确保在miDebuggerPath中设置正确的路径
  2. c_cpp_properties.json中,确保设置正确的includePathcompilerPath

我最终要做的是在运行可执行文件的文件夹中创建一个指向共享DLL的符号链接。您需要以管理员身份打开PowerShell并运行它。例如,如果您链接可执行文件(在其他文件夹中编译(的某个名为c:\git\csvdb的文件夹中有一个名为libcsvdb.DLL的DLL,则要使程序找到运行以下命令所需的DLL;

New-Item -ItemType SymbolicLink -Path "libcsvdb.dll" -Target "c:gitcsvdblibcsvdb.dll"

它提供的唯一好处是,您不需要一直到系统环境来更改全局路径。

最新更新