Неразрешенная ошибка внешнего символа при использовании библиотеки CImg

Я пытаюсь использовать библиотеку CImg для некоторой задачи обработки изображений. Используя VS 2012 в Windows 7 x64, я создаю проект для создания dll, который мне нужен для моего приложения. Я включил единственный заголовочный файл CImg.h из библиотеки. Но как только я инициализирую объект CImg, я получаю кучу неразрешенных ошибок внешнего символа. Один образец ошибки выглядит следующим образом:

layer.obj : error LNK2019: unresolved external symbol __imp_SetDIBitsToDevice referenced in function "public: struct cimg_library::CImgDisplay & __cdecl cimg_library::CImgDisplay::paint(void)" (?paint@CImgDisplay@cimg_library@@QEAAAEAU12@XZ)

Может ли кто-нибудь объяснить мне, что я делаю неправильно и как это исправить? (Я новичок в терминологии С++.)


person Prakhar    schedule 22.07.2016    source источник
comment
Возможный дубликат: Что является неразрешенным символом и...   -  person Thomas Matthews    schedule 22.07.2016
comment
Вам нужно указать MSVC (компилятору) связать библиотеку. Я думаю, что в VS это делается через меню настроек проекта. Идея использования библиотек заключается в том, что вам нужно (A) включить файл заголовка и (B) связать с DLL. Они используются на двух разных этапах процесса сборки отдельными частями компилятора.   -  person iksemyonov    schedule 22.07.2016
comment
Но в библиотеке CImg нет ничего, кроме заголовочного файла, на который можно ссылаться.   -  person Prakhar    schedule 22.07.2016


Ответы (2)


в библиотеке CImg нет ничего, кроме файла заголовка, на который можно ссылаться.

Вы не можете ссылаться на заголовочный файл. Если это библиотека только для заголовков, вам не нужно ничего связывать. Вы включаете заголовочный файл, и функции, которые он определяет, компилируются напрямую. Похоже, это относится к CImg; в документации говорится, что это автономная библиотека шаблонов, состоящая только из одного заголовочного файла. Так что действительно, все, что вам нужно сделать, это включить его, и вы отправляетесь на гонки.

Неразрешенные ошибки внешнего символа возникают откуда-то еще. Вы должны прочитать сообщения об ошибках и посмотреть на имена функций, чтобы увидеть, где именно.

Пара советов:

  1. Префикс __imp_ предполагает, что вы смотрите на функцию Windows API.
  2. Если вы этого не знали, вы всегда можете проигнорировать префикс и погуглить удобочитаемую часть имени, в данном случае SetDIBitsToDevice. Скорее всего, вы найдете документацию или, по крайней мере, что-то, что укажет вам правильное направление.

Действительно, в этом случае вы получаете право на документацию Microsoft SDK для SetDIBitsToDevice функция. Это функция Windows API, и документация Microsoft всегда говорит вам, на какую библиотеку вам нужно ссылаться, чтобы ее использовать. Посмотрите внизу страницы:

Заголовок: Wingdi.h (включая Windows.h)
Библиотека: Gdi32.lib
DLL: Gdi32.dll

Заголовочный файл библиотеки CImg, очевидно, уже включает заголовочный файл Windows.h, иначе вы получили бы ошибку времени компиляции. Вы получаете сообщение об ошибке компоновщика, что означает, что вы не указали компоновщику компоновку в библиотеке Gdi32.lib. Это то, что позволит вам вызывать функции GDI. Это заглушка, облегчающая вызов функций, экспортированных из Gdi32.dll.

В общем, при создании приложения для Windows вы захотите связать, как минимум, kernel32.lib, user32.lib и gdi32.lib.

Этот вопрос содержит дополнительную информацию о том, как справляться с ошибками неопределенных символов, а также о том, как настроить компоновщик. В Visual Studio перейдите в раздел Свойства проекта Компоновщик C/C++ Введите дополнительные зависимости. Или добавьте #pragma comment(lib, "gdi32.lib") в исходный файл (ваш предварительно скомпилированный заголовок — хорошее место, обычно называемое StdAfx.h).

person Cody Gray    schedule 22.07.2016

Эта функция является частью API win32, особенно в GDI. Вам нужно изменить настройки вашего проекта, чтобы связать его с Gdi32.lib.

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162974(v=vs.85).aspx

person Photon    schedule 22.07.2016
comment
Да, мне пришлось связать несколько библиотек, включая gdi32, чтобы успешно собрать проект. Спасибо за ваш ответ. - person Prakhar; 22.07.2016