VS2010中的Magick ++ - 未解析的外部符号

时间:2010-12-21 12:26:56

标签: c++ visual-studio-2010 imagemagick unresolved-external magick++

我正在尝试将ImageMagick Magick ++用于VS2010中的C ++项目。 我从这里安装了库: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

我做错了什么?

非常感谢你的帮助!

更新

设置链接器 - &gt;输入 - &gt;附加依赖:

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

和链接器 - &gt;一般 - &gt;附加图书馆目录:

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

它仍会导致相同的错误...

更新2

在C:\ Program Files \ ImageMagick-6.6.6-Q16 \ lib中打开.lib文件会导致此错误: alt text

更新3

CORE_RL_Magick ++ _。lib确实包含?InitializeMagick @ Magick @@ YAXPEBD @ Z,但不是吗?InitializeMagick @ Magick @@ YAXPBD @ Z.这是否意味着.lib文件已损坏?

更新4

我通过手动编译.lib文件解决了我的问题。 谢谢大家!

4 个答案:

答案 0 :(得分:3)

  

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声明符。你有一些编译设置将char *转换为64位指针。就像编译针对64位操作系统的代码一样。但是链接32位.lib。这通常会生成关于.lib的位错误的链接器错误,不能确定为什么你没有看到这个错误。也许是一个mingw神器,不知道它是如何工作的。

答案 1 :(得分:1)

您还应该向Visual Studio指明要用于链接的 .lib

链接器中的

- &gt;输入 - &gt;附加依赖

编辑:并放置魔法库的路径

链接器中的

- &gt;一般 - &gt;附加图书馆目录

EDIT2:如果它仍然不起作用,那么你正在使用错误的导出签名调用一个函数。 启动msdev工具Dependency Walker。并检查magick.lib是否真正导出名为?InitializeMagick@Magick@@YAXPBD@Z

的函数

我错了,它不是微软工具:Dependency Walker

我错了Dependency Walker没有打开.lib,只有Dlls和Exes。 但是,由于您在.lib文件的内容中找到了?InitializeMagick@Magick@@YAXPBD@Z,这意味着它会以这种方式进行重新导出。

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 ++以不同的方式理解它。 (这就是为什么我需要看到函数的原型)

答案 2 :(得分:0)

  

您还应该向Visual Studio指明要用于链接的.lib     在链接器中 - &gt;输入 - &gt;附加依赖

谢谢! 附加的dependecies行现在包含以下文本(查看结尾):     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 ...

答案 3 :(得分:0)

documentation说:“Windows用户可以通过手动编辑其中一个Magick ++演示程序的项目文件来开始。”你试过吗?