Magick ++ в VS2010 - неразрешенный внешний символ - PullRequest
5 голосов
/ 21 декабря 2010

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

Затем в своем проекте я добавил c: / program files / ImageMagick-6.6.6-Q16 / 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

Что я делаю не так?

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

UPDATE:

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

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

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

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

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

ОБНОВЛЕНИЕ 2

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

ОБНОВЛЕНИЕ 3

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

ОБНОВЛЕНИЕ 4

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

Ответы [ 4 ]

3 голосов
/ 21 декабря 2010

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, не знаю, как он работает.

1 голос
/ 21 декабря 2010

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

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

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

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

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

Я ошибаюсь, это не инструмент Microsoft: Зависимость 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 ++ понимает его по-разному.(вот почему мне нужно увидеть прототип функции)

0 голосов
/ 21 декабря 2010

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

0 голосов
/ 21 декабря 2010

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

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

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

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

...