ctest,cmake&mingw:可执行文件生成,但由于未找到新的DLL而无法运行

问题描述 投票:0回答:1

顶级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下,一切正常。为了使cmakectest在Windows和MinGW下正常工作,需要进行哪些修改?

dll cmake mingw ctest
1个回答
0
投票
[您的问题似乎是Windows DLL搜索过程无法在mylib.dll运行您的Demo可执行文件时找到ctest。 Windows DLL搜索顺序指定为here

    从中加载应用程序的目录。
  1. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
  2. 16位系统目录。没有获取该目录路径的函数,但会对其进行搜索。
  3. Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
  4. 当前目录。
  5. 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)
  • © www.soinside.com 2019 - 2024. All rights reserved.