为什么我的程序要求 OpencV 的 .dll,即使我静态链接到它的 .lib

2023-12-29

我正在构建一个使用 OpenCV 3.1 与 CMake 3.5 和 Visual Studio 2015 x64 的小程序。

我链接到 OpenCV 的 .lib 文件,但是当我尝试运行该程序时,出现有关缺少 DLL 的错误:

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project (MyProj)

set(CMAKE_FIND_LIBRARY_SUFFIXES, ".lib")

#Boost
set(Boost_USE_STATIC_LIBS        ON)
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost REQUIRED system thread serialization filesystem)

#OpenCV
find_package(OpenCV REQUIRED)

add_executable(
        MyApp
        main.cpp
)

target_include_directories(MyApp PRIVATE
        ${OpenCV_INCLUDE_DIRS}
        ${Boost_INCLUDE_DIRS}
)

target_link_libraries(MyApp
        ${OpenCV_LIBRARIES}
        ${Boost_LIBRARIES}
)

OpenCV_DIR被设定为C:\tools\opencv3\build\x64\vc14\lib其中有include/ opencv_world310.lib opencv_world310d.lib OpenCVConfig.cmake OpenCVModules.cmake OpenCVModules-debug.cmake OpenCVModules-release.cmake并从官方 Windows 二进制文件中提取OpenCV v3.1

然后我生成 VS 解决方案cmake . -G "Visual Studio 14 Win64"

As you can see, OpenCV lib was added to dependencies: enter image description here

并在链接步骤中使用:

Link:
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:QUEUE /OUT:"C:\...\Debug\MyApp.exe" /
  INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib 
  advapi32.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib 
  C:\tools\opencv3\build\x64\vc14\lib\opencv_world310d.lib "C:\tools\boost_1_61_0\stage\lib\libboost_system-vc140-mt-gd-1_61.lib" 
  "C:\tools\boost_1_61_0\stage\lib\libboost_thread-vc140-mt-gd-1_61.lib" 
  "C:\tools\boost_1_61_0\stage\lib\libboost_serialization-vc140-mt-gd-1_61.lib" 
  "C:\tools\boost_1_61_0\stage\lib\libboost_filesystem-vc140-mt-gd-1_61.lib" 
  "C:\tools\boost_1_61_0\stage\lib\libboost_chrono-vc140-mt-gd-1_61.lib" 
  "C:\tools\boost_1_61_0\stage\lib\libboost_date_time-vc140-mt-gd-1_61.lib" 
  "C:\tools\boost_1_61_0\stage\lib\libboost_atomic-vc140-mt-gd-1_61.lib" /MANIFEST /MANIFESTUAC:"level='asInvoker' 
  uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:/Users/.../Debug/MyApp.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /
  IMPLIB:"C:/Users/.../Debug/MyApp.lib" /MACHINE:X64  /machine:x64 MyApp.dir\Debug\sheepface.obj MyApp.dir\Debug\source.obj
  MyApp.vcxproj -> C:\Users\...\Debug\MyApp.exe
  MyApp.vcxproj -> C:/Users/.../Debug/MyApp.pdb (Full PDB)

我已经尝试过设置神奇变量

set(OpenCV_STATIC ON)
set(BUILD_SHARED_LIBS     OFF)

但他们没有什么区别


您可以通过三种不同的选择来创建和使用库;静态、动态隐式和动态显式。 library.lib 不一定是静态库,它将包含您期望的编译代码。它要么包含代码,要么(简单地说)包含所需的名称*.dll,由操作系统加载,入口指向该 dll 内的函数。如果您不知道特定库是什么类型的库,您可以使用

lib /list foo.lib

(see here https://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import) 来确定库的类型。如果它是静态库,它会向您显示一些.obj创建库时使用的文件。如果是导入库,它会显示所需的.dll你应该提供。 dll 本身应该位于搜索路径之一。如果您想使用某些特殊路径,它可能会变得非常复杂,但最简单的是将其放入与使用它的可执行文件或系统文件夹相同的文件夹中。读动态链接库搜索顺序 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx了解更多详情。静态库和隐式动态库都需要一个头文件和一个 .lib 文件。

您必须使用第三种方式(动态显式)加载库[AW] https://msdn.microsoft.com/library/windows/desktop/ms684175(v=vs.85).aspx, 获取进程地址 https://msdn.microsoft.com/en-us/library/windows/desktop/ms683212(v=vs.85).aspx and 免费图书馆 https://msdn.microsoft.com/en-us/library/windows/desktop/ms683152(v=vs.85).aspx。这里指定 dll 的路径并“直接”使用该 dll。您没有任何标头或 .lib 文件,但必须知道exactly函数的命名方式以及声明方式(返回值和参数值类型),否则您的程序将无法按预期工作。

您可以在以下位置找到有关 dll 的更多信息MSDN https://msdn.microsoft.com/en-us/library/253b8k2c.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的程序要求 OpencV 的 .dll,即使我静态链接到它的 .lib 的相关文章

随机推荐