【发布时间】: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。
我尝试了很多东西:
- 在
launch.json文件中设置additionalSOLibSearchPath - 在
launch.json文件中设置一个特殊的setupCommand,例如"text": "set env PATH=${PATH}:${workspaceFolder}/build/src" - 在
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。在该仓库中,您需要更改两个参数以适应您的本地环境:
- 在
launch.json中,确保在miDebuggerPath中设置正确的路径 - 在
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