Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows和CMake下的共享库:安装前未找到DLL_Windows_Dll_Cmake - Fatal编程技术网

Windows和CMake下的共享库:安装前未找到DLL

Windows和CMake下的共享库:安装前未找到DLL,windows,dll,cmake,Windows,Dll,Cmake,库mylib由目录lib/中的库和目录test/中的测试套件组成。它完全处于CMake控制之下: mylib/CMakeLists.txt: ... add_subdirectory(lib) add_subdirectory(test) ... mylib/lib/CMakeLists.txt: ... add_library(my_lib ${src_files}) ... mylib/test/CMakeLists.txt: ... add_executable(mytest my

mylib
由目录
lib/
中的库和目录
test/
中的测试套件组成。它完全处于CMake控制之下:

mylib/CMakeLists.txt:
...
add_subdirectory(lib)
add_subdirectory(test)
...


mylib/lib/CMakeLists.txt:
...
add_library(my_lib ${src_files})
...


mylib/test/CMakeLists.txt:
...
add_executable(mytest mytest.c)
target_link_libraries(mytest mylib)
构建步骤包括:

mkdir build
cd build
cmake ..
make
ctest         # or make test
make install
在Linux下工作,多年来稳定。但在Windows10下,会弹出一个消息窗口,标题为“mytest.exe-系统错误”:“由于找不到mylib.dll,代码无法继续执行。重新安装程序可能会解决此问题。”

不,安装(而不是重新安装)不是一个好的解决方案:我需要在安装库之前先测试它(顺便说一句:这不包括针对类似问题提出的大多数解决方案)


CMake不应该跨平台工作吗?使上述构建步骤在Windows下工作的最小侵入性调整是什么?

在Windows上执行此操作的正确方法是为测试运行填充
PATH
环境变量:

set_tests_properties(your_test_name
  PROPERTIES
      ENVIRONMENT PATH="path-containing-your-dll")
如果包含dll的路径是在构建中生成的工件的函数,我相信您可以使用生成器表达式


Cherry在顶部:自cmake 3.13以来,变量
VS_DEBUGGER_ENVIRONMENT
也可以设置为在Visual Studio中具有良好的调试行为的目标(例如,能够直接从Visual调试应用程序,而不是通过
ctest
)。

是否有对此进行扩展的参考?解释为什么这是正确的方法?Windows依赖于几个线索来查找DLL。干扰较小的一个是通过更改
路径
环境变量,如果我记得的话,其他的是将这些DLL放在操作系统的一些特定文件夹中<代码>路径提供了最灵活的方法,将DLL的物理位置(您的cmake想要做的事情)与查找DLL的Windows机制分离。这就是为什么我认为这是正确的方法:在对应用程序限制最小的情况下模仿Windows的预期行为。有关更多详细信息,请参阅。