Ошибка «неразрешенный внешний символ» при связывании с OpenCV 3.0

Я создаю OpenCV 3.0 из исходного кода. И с репозиторием contrib для некоторых дополнительных модулей. И я вручную настроил свой проект VS2013 для использования сгенерированных файлов lib.

Мой код пока прост:

#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;
}

Но это дало мне эти ошибки, когда в версии сообщества VS 2013:

введите здесь описание изображения

Я вижу похожий поток , они сказали, что это вызвано проблемой x86/x64. Но Мой проект уже x86. И созданный мной OpenCV также ориентирован на x86 (см. ниже). Какая это может быть причина?

введите здесь описание изображения

ДОБАВИТЬ 1

Проект OpenCV 3.0 INSTALL создает следующий каталог lib:

Так что это действительно x86.

введите здесь описание изображения

Мой путь к библиотеке настроен на указанный выше путь:

введите здесь описание изображения

И я добавил все файлы *d.lib.

введите здесь описание изображения

А ниже мой проект ВК Configuration Manager

введите здесь описание изображения

Так что это действительно тоже x86.

Где может быть ошибка?

ДОБАВИТЬ 2

Я вручную искал функцию fastFree(). Он определен в файле opencv_core300d.lib. Я использую команду dumpbin /symbols для проверки символов. И я обнаружил, что его имя искажено точно так же, как fastFree@cv@@YAXPAX@Z. Так почему его нельзя найти?


person smwikipedia    schedule 21.07.2015    source источник
comment
похоже, вы компилируете OpenCV из исходников. Если да, то создаете ли вы также проект INSTALL, который поставит библиотеки в правильное положение? Или вы можете просто скачать предварительно скомпилированные библиотеки   -  person Miki    schedule 21.07.2015
comment
@Miki Да, я компилирую из исходного кода, потому что мне нужно использовать некоторые дополнительные модули, которые не включены в официальную сборку. И да, я создаю проект INSTALL. Этот проект поместил библиотеки в такое место: ..\install\x86\vc12\staticlib, которое я добавил в свой проект VC в качестве дополнительного пути к библиотеке. Я добавил скриншоты к своему вопросу.   -  person smwikipedia    schedule 21.07.2015
comment
Я предполагаю, что вы также добавили opencv_coreXXX и т. д. в Linker -> Input -> Additional Dependencies, верно?   -  person Miki    schedule 21.07.2015
comment
@Miki Да, я добавил их как *d.lib. Пожалуйста, посмотрите мой недавно добавленный скриншот.   -  person smwikipedia    schedule 21.07.2015
comment
@Miki Я перешел на официальную сборку OpenCV 3.0.0. Возникли точно такие же ошибки.   -  person smwikipedia    schedule 21.07.2015
comment
Мне также нужно установить OpenCV 3.0 (я использовал 2.4.9). Я устанавливаю их и возвращаюсь к вам   -  person Miki    schedule 21.07.2015
comment
добавлен шаг для запуска фрагмента. Вы, вероятно, забыли некоторые из необходимых библиотек (на самом деле вам нужно намного больше, чем OpenCV 2.4.9, я тоже запутался).   -  person Miki    schedule 21.07.2015
comment
У меня была такая же проблема, и мне казалось, что мне не хватает какой-то библиотеки. Используя цель INSTALL, я смог собрать все необходимые файлы, и ошибка компоновщика исчезла.   -  person Brian Stewart    schedule 08.02.2019


Ответы (1)


Вот шаги по использованию OpenCV 3.0.0 с предварительно скомпилированными библиотеками для проекта C++, который статически связывает OpenCV, в Windows (проверено с Windows 8.1) и Visual Studio (проверено с Visual Studio 2013) для запуска этой программы:

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

int main()
{
    Mat3b img = imread("path_to_image");
    imshow("img", img);
    waitKey();
    return 0;
}
  1. Загрузите с http://opencv.org/downloads.html.
  2. Извлекать
  3. Let's call OPENCV_DIR the dir containing:
    • build
    • источник
  4. Create an empty project:
    • New Project -> Visual C++ -> Empty Project
  5. Добавьте файл cpp (например, Start.cpp), который будет содержать вашу основную функцию (например, фрагмент выше).
  6. ОТЛАДКА конфигурации
  7. Add include and lib directories:
    • Configuration Properties -> VC++ Directories
    • Включить каталоги: добавить OPENCV_DIR\build\include
    • Каталоги библиотек: добавьте OPENCV_DIR\build\x86\vc12\staticlib
  8. Добавьте необходимые библиотеки (следующие хороши для этого простого примера, вы должны добавить больше, если вам нужны другие функции):

    • 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
    • % (дополнительные зависимости)
  9. Свойства конфигурации -> C/C++ -> Генерация кода -> Библиотека времени выполнения

    • Set to Multi-threaded Debug (/MTd)
  10. Для сборки RELEASE вам необходимо выполнить шаги с 6 по 9 в режиме выпуска, добавив библиотеки без завершающей буквы «d» на шаге 8 и многопоточность (/MT) на шаге 9.

  11. Наслаждаться!

В качестве бонуса я также рекомендую установить расширение Image Watch для Visual Studio. Очень-очень полезно для отладки ваших Mat!

person Miki    schedule 21.07.2015
comment
Я сравнил ваши настройки со своими. Кажется, я не могу использовать *d.lib как аббревиатуру для всех файлов lib. Я изменил список файлов lib соответственно, и теперь он хорошо компилируется. Я использую VS2013 Community версию. Спасибо. - person smwikipedia; 22.07.2015
comment
Кроме того, я обнаружил, что в моей сборке отсутствует IlmImfd.lib. В официальной сборке это довольно большая библиотека (почти 28M). Но он все равно компилируется без него. Не уверен, для чего это нужно. - person smwikipedia; 22.07.2015
comment
Не работает для 3.3.1: fatal error LNK1104: cannot open file 'opencv_world311d.lib' - person Schütze; 19.12.2017