我在使用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并成功运行测试。
编辑
您可以在此处找到示例回购:https://github.com/zadigus/cmake-cpp-gtest.在回购中,您需要更改两个参数以适应您的本地环境:
- 在
launch.json
中,确保在miDebuggerPath
中设置正确的路径 - 在
c_cpp_properties.json
中,确保设置正确的includePath
和compilerPath
我最终要做的是在运行可执行文件的文件夹中创建一个指向共享DLL的符号链接。您需要以管理员身份打开PowerShell并运行它。例如,如果您链接可执行文件(在其他文件夹中编译(的某个名为c:\git\csvdb的文件夹中有一个名为libcsvdb.DLL的DLL,则要使程序找到运行以下命令所需的DLL;
New-Item -ItemType SymbolicLink -Path "libcsvdb.dll" -Target "c:gitcsvdblibcsvdb.dll"
它提供的唯一好处是,您不需要一直到系统环境来更改全局路径。