'unresolved external symbol' error when li

2019-01-04 14:10发布

I build the OpenCV 3.0 from source. And with the contrib repo for some extra modules. And I manually setup my VS2013 project to use the generated lib files.

My code is simple for now:

#include "opencv2\core\core.hpp"
#include "opencv2\imgcodecs\imgcodecs.hpp"

int _tmain(int argc, _TCHAR* argv[])
{
    cv::Mat image = cv::imread("img.jpg");
    return 0;
}

But it gave me these errors when in VS 2013 community version:

enter image description here

I see similar thread, they said it is caused by the x86/x64 issue. But My project is already x86. And the OpenCV I built is also targeting x86 (see below). What reason could it be?

enter image description here

ADD 1

The OpenCV 3.0 INSTALL project generates the following lib directory:

So it is indeed a x86 one.

enter image description here

My lib path is configured to the above path:

enter image description here

And I added all the *d.lib files.

enter image description here

And below is my VC project's Configuration Manager

enter image description here

So it is indeed x86, too.

Where could be wrong?

ADD 2

I manually searched for the fastFree() function. It is defined in the opencv_core300d.lib file. I use the dumpbin /symbols command to check the symbols. And I find its name is mangled exactly as fastFree@cv@@YAXPAX@Z. So why it cannot be found?

2条回答
欢心
2楼-- · 2019-01-04 14:57

Here the steps to use OpenCV 3.0.0 with precompiled libs, for a C++ project that links OpenCV statically, in Windows (tested with Windows 8.1) and Visual Studio (tested with Visual Studio 2013) to run this program:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    Mat3b img = imread("path_to_image");
    imshow("img", img);
    waitKey();
    return 0;
}
  1. Download from http://opencv.org/downloads.html
  2. Extract
  3. Let's call OPENCV_DIR the dir containing:
    • build
    • source
  4. Create an empty project:
    • New Project -> Visual C++ -> Empty Project
  5. Add a cpp file (say Start.cpp) that will contain your main function (e.g. the snippet above)
  6. Configuration DEBUG
  7. Add include and lib directories:
    • Configuration Properties -> VC++ Directories
    • Include Directories: add OPENCV_DIR\build\include
    • Library Directories: add OPENCV_DIR\build\x86\vc12\staticlib
  8. Add required libs (the following are good for this simple example, you should add more if you need other functionalities):

    • opencv_core300d.lib
    • opencv_highgui300d.lib
    • opencv_imgproc300d.lib
    • opencv_hal300d.lib
    • opencv_imgcodecs300d.lib
    • libjpegd.lib;
    • libpngd.lib
    • libjasperd.lib
    • IlmImfd.lib
    • libtiffd.lib
    • libwebpd.lib
    • zlibd.lib
    • ippicvmt.lib
    • %(AdditionalDependencies)
  9. Configuration Properties -> C/C++ -> Code Generation -> Runtime Library

    • Set to Multi-threaded Debug (/MTd)
  10. For a RELEASE build, you need to do steps from 6 to 9 in release mode, adding libs without the trailing "d" in step 8, and Multi threaded (/MT) in step 9.

  11. Enjoy!

As a bonus, I also recommend to install Image Watch extension for Visual Studio. Very very useful for debugging your Mats!

查看更多
一纸荒年 Trace。
3楼-- · 2019-01-04 15:00

Obviously you are linking mismatched libs. Depending on your setup, either change your project into 64 bit by 'Project Properties -> Configuration Manager', or change your lib path to point to x86 libs. (btw, since I'm a new user, I cannot comment, so I have to write it as an answer here)

查看更多
登录 后发表回答