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的预期行为。有关更多详细信息,请参阅。