【发布时间】:2019-12-17 15:01:16
【问题描述】:
顶级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
然后测试成功。所以唯一的问题是运行ctest时找不到build/lib/mylib.dll。而C:\opt\x64\lib 在PATH 中,因此DLL 在cmake --install 之后找到。然而,这不是我们想要的:ctest 应始终使用当前构建的新 DLL,而不是安装的版本。
在 Linux 下,一切正常。为什么它不适用于 Windows 和 MinGW?这是 CMake 中的错误吗?我们如何解决这个问题,以便ctest 在所有平台上正确执行?
【问题讨论】:
-
我编辑了我的问题,以表明它不仅是一种解决方法,而且是关于理解为什么干净的标准 CMake 代码不起作用。
-
它工作正常。您的运行时环境错误,您需要修复它。如果您构建了一个已经安装的共享库并且需要使用正确的共享库,那么这与在 Linux 上设置 RPATH 没有什么不同。
标签: dll cmake environment-variables mingw ctest