Magick++ в VS2010 - неразрешенный внешний символ

Я пытаюсь использовать ImageMagick Magick++ для проекта C++ в VS2010. Я установил библиотеку отсюда: Klick

Затем в своем проекте я добавил c:/program files/ImageMagick-6.6.6-Q16/include в папки include. Затем я попытался использовать Magick ++ с этим кодом:

#include <Magick++.h>
void main(int argc, char ** argv){
    InitializeMagick(*argv);
}

Но это не работает! VS2010 возвращает следующие ошибки:

error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl    Magick::InitializeMagick(char const *)" (__imp_?InitializeMagick@Magick@@YAXPBD@Z)
error LNK1120: 1 unresolved externals

Что я делаю неправильно?

Большое спасибо за вашу помощь!

ОБНОВИТЬ:

Установите Linker -> Input -> Addennal Dependencies, чтобы:

kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;CORE_RL_Magick++_.lib

And Linker -> General -> Каталоги дополнительных библиотек:

C:\Program Files\ImageMagick-6.6.6-Q16\lib

Это все равно приводит к той же ошибке...

ОБНОВЛЕНИЕ 2

Открытие.lib файлов в C:\Program Files\ImageMagick-6.6.6-Q16\lib приводит к этой ошибке:альтернативный текст

ОБНОВЛЕНИЕ 3

CORE_RL_Magick ++ _. Lib содержит?InitializeMagick@Magick@@YAXPEBD@Z, но не?InitializeMagick@Magick@@YAXPBD@Z. Означает ли это, что файл.lib поврежден?

ОБНОВЛЕНИЕ 4

Я решил свою проблему, вручную компилируя файлы.lib. Спасибо всем!

4 ответа

CORE_RL_Magick++_. Lib содержит?InitializeMagick@Magick@@YAXPEBD@Z, но не?InitializeMagick@Magick@@YAXPBD@Z

Используя утилиту undname.exe, эти имена удаляются:

void __cdecl Magick::InitializeMagick(char const *)
void __cdecl Magick::InitializeMagick(char const * __ptr64)

Обратите внимание на объявление __ptr64, которое вы получили в качестве аргумента. У вас есть какая-то настройка компиляции, которая превращает этот символ * в 64-битный указатель. Как компиляция этого кода для 64-битной операционной системы. Но связывание 32-битного.lib. Обычно это генерирует ошибку компоновщика о том, что битность.lib неверна, поэтому не уверен, почему вы этого не видите. Может быть, артефакт Mingw, не уверен, как он работает.

Вы также должны указать в Visual Studio .lib, который будет использоваться для компоновки

в компоновщике -> ввод -> дополнительные зависимости

РЕДАКТИРОВАТЬ: и положить путь к библиотеке магии

в компоновщике -> Общие -> Каталоги дополнительных библиотек

EDIT2: если это все еще не работает, то вы вызываете функцию с неправильной экспортированной подписью. Запустите инструмент msdev Dependency Walker. И проверьте, действительно ли magick.lib экспортирует функцию, имя которой ?InitializeMagick@Magick@@YAXPBD@Z

Я ошибаюсь, это не инструмент Microsoft: Dependency Walker

Я был не прав Dependency Walker не открывает.lib, только Dlls и Exes. Однако, так как вы нашли ?InitializeMagick@Magick@@YAXPBD@Z в содержимом файла.lib это означает, что он действительно экспортируется таким образом.

EDIT3: вы уверены, что имя и папка дополнительной библиотеки правильные. Я действительно не могу придумать другую причину неспособности Visual C++ связываться с вашей библиотекой. Если ваш.lib DO содержит строку ?InitializeMagick@Magick@@YAXPBD@Z Я действительно думаю, что это должно связать.

EDIT4: не могли бы вы вставить из файла <Magick++.h> определение прототипа InitializeMagick? есть что-то, что делает его по-разному компилируемым между Visual C++ и вашим поставщиком библиотеки. ?InitializeMagick@Magick@@YAXPEBD@Z а также ?InitializeMagick@Magick@@YAXPEBD@Z две разные подписи. Когда в том числе <Magick++.h> Visual C++ понимает его по-разному. (вот почему мне нужно увидеть прототип функции)

В документации говорится: "Пользователи Windows могут начать работу, вручную отредактировав файл проекта для одной из демонстрационных программ Magick ++". Ты пробовал это?

Вы должны также указать Visual Studio,.lib, который будет использоваться для компоновки в Linker -> Input -> Additionnal Dependencies

Спасибо! Строка дополнительных зависимостей теперь содержит следующий текст (смотрите в конце): kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;C:\Program Files\ImageMagick-6.6.6-Q16\lib\CORE_RL_Magick++_.lib

Это все еще не работает. Это неправильный.lib файл?

для чего этот файл.lib? Разве исходный код не должен просто работать? Там нет никакой DLL...

Другие вопросы по тегам