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...