顶级CMakeLists.txt
包含
include(CTest)
add_subdirectory(lib)
add_subdirectory(demo)
add_subdirectory(test)
lib/CMakeLists.txt
本质上是
add_library(MyLib <sources>)
demo/CMakeLists.txt
本质上是
add_executable(Demo demo.c)
target_link_libraries(Demo MyLib)
test/CMakeLists.txt
就是
add_test(NAME Demo COMMAND Demo)
从gitlab-runner,我们执行
cmake -G "Ninja" -DCMAKE_INSTALL_PREFIX=C:\opt\x64 -B. ..
cmake --build
ctest --output-on-failure
前两个步骤成功;第三个失败,
Start 1: Demo
1/1 Test #1: Demo .......................Exit code 0xc0000135
***Exception: 0.03 sec
如果我重试
cmake --install
ctest
然后测试成功。因此,唯一的问题是在运行build/lib/mylib.dll
时找不到ctest
。而C:\opt\x64\lib
位于PATH
中,因此DLL是在cmake --install
之后找到的。但是,这不是我们想要的:ctest
应始终使用当前版本中的新鲜DLL,而不是已安装的版本。
在Linux下,一切正常。为了使cmake
和ctest
在Windows和MinGW下正常工作,需要进行哪些修改?
mylib.dll
运行您的Demo
可执行文件时找到ctest
。 Windows DLL搜索顺序指定为here:从中加载应用程序的目录。
- 系统目录。使用
GetSystemDirectory
函数获取此目录的路径。- 16位系统目录。没有获取该目录路径的函数,但会对其进行搜索。
- Windows目录。使用
GetWindowsDirectory
函数获取此目录的路径。- 当前目录。
PATH
环境变量中列出的目录。请注意,这不包括由指定的每个应用程序路径App Paths
注册表项。在以下情况下不使用App Paths
键计算DLL搜索路径。
PATH
环境变量修改为也包括当前版本中新DLL的位置。
一种更好的,更不易出错的解决方案可能是将DLL与Demo
可执行文件放在同一目录中。您可以通过修改顶级CMake文件,强制CMake为DLL和可执行文件使用相同的binary目录:
include(CTest)
add_subdirectory(lib ${CMAKE_BINARY_DIR}/demo)
add_subdirectory(demo ${CMAKE_BINARY_DIR}/demo)
add_subdirectory(test)