Верхний уровень 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 из текущей сборки, а не установленную версию.
Под линуксом все работает корректно. Почему нет для Windows и MinGW? Это ошибка в CMake? Как мы можем обойти это, чтобы ctest
правильно выполнялся на всех платформах?