【问题标题】:How do I tell VSCode to load my shared dlls upon debugging c++ code?如何告诉 VSCode 在调试 c++ 代码时加载我的共享 dll?
【发布时间】:2020-11-02 10:47:09
【问题描述】:

我在使用 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")

特别是,它们使用了crc DLL。

如果我将我的 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 并成功运行测试。

编辑

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

  1. launch.json中,确保在miDebuggerPath中设置正确的路径
  2. c_cpp_properties.json中,确保设置正确的includePath以及compilerPath

【问题讨论】:

  • 你是如何运行测试的?使用ctest 还是手动调用测试可执行文件?请出示minimal reproducible example
  • 我在最初的帖子中添加了代码链接。我以两种方式运行测试: 1. 只需运行测试可执行文件 testcrc.exe 2. 使用 Visual Studio 代码的调试器运行。我对调试器感兴趣。我希望它启动时知道 libcrc.dll 在哪里。
  • 修复环境 PATH 变量对我有帮助。尝试使用反斜杠
  • 别忘了,你必须追加/追加到PATH,而不是覆盖它!正确的方式是:"environment": [{"name" : "PATH", "value" : "${workspaceFolder}/build/src;${env:PATH}"}].

标签: c++ visual-studio-code cmake


【解决方案1】:

我最终必须这样做的方法是在我运行可执行文件的文件夹中创建一个指向共享 DLL 的符号链接。 您需要以管理员身份打开 PowerShell 并运行它。例如,如果在某个名为 c:\git\csvdb 的文件夹中有一个名为 libcs​​vdb.dll 的 DLL,您已将可执行文件(在其他文件夹中编译)与之链接,为了让您的程序找到您需要运行以下内容的 DLL命令;

New-Item -ItemType SymbolicLink -Path "libcsvdb.dll" -Target "c:\git\csvdb\libcsvdb.dll"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2021-05-26
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多