我正在构建一个使用 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
并从 OpenCV v3.1
然后我使用 cmake 生成 VS 解决方案。 -G "Visual Studio 14 Win64"
并在链接步骤中使用:
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
(参见 here )以确定库的类型。如果它是静态库,它会显示一些在创建库时使用的 .obj 文件。如果它是导入库,它将向您显示您应该提供的所需 .dll。 dll 本身应该在其中一个搜索路径中。如果你想使用一些特殊的路径,它会变得相当复杂,但最简单的是将它放在与使用它的可执行文件相同的文件夹或系统文件夹中。阅读Dynamic-Link Library Search Order了解更多详情。静态库和隐式动态库都需要一个头文件和一个 .lib 文件。
第三种方式(动态显式)你必须使用LoadLibrary[AW] , GetProcAddress和 FreeLibrary .在这里指定 dll 的路径并“直接”使用 dll。您没有任何头文件或 .lib 文件,但必须确切地了解函数的命名方式和声明方式(返回和参数值类型),否则您的程序将无法按预期运行。
您可以在 MSDN 上找到有关 dll 的更多信息.
关于c++ - 为什么我的程序要求 OpencV 的 .dll,即使我静态链接到它的 .lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592708/