【发布时间】:2016-07-26 14:30:54
【问题描述】:
我正在构建一个使用 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 的官方Windows 二进制文件中提取的
然后我用cmake . -G "Visual Studio 14 Win64"生成VS解决方案
and 用于链接步骤:
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)
但它们没有区别
【问题讨论】:
-
lib 是静态库还是 dll 的 lib?
-
你必须链接到静态版本的opencv。在 prebuild openCV 文件夹中通常有 3 个文件夹,例如在我的 32 位 opencv 2.4.11 中有
x86/vc12/binx86/vc12/lib和x86/vc12/staticlib您必须选择staticlib文件夹中的库。 -
所以对你来说应该是
x64/vc14/staticlib/,如果该文件夹不存在,你必须自己编译静态链接的opencv。 -
或多或少是对的……阅读implicit linking了解更多详情。
-
@grisevg 对于 Visual c++,共享库的典型过程是有一些头文件、一些库(在编译时需要)和一些 dll(在运行时需要)。您可能会找到一些关于在这种情况下需要/使用哪些库的信息。
标签: c++ visual-studio opencv cmake static-linking