7

我正在尝试将 ImageMagick Magick++ 用于 VS2010 中的 C++ 项目。我从这里安装了库:klick

然后在我的项目中,我将 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

我究竟做错了什么?

非常感谢您的帮助!

更新:

将链接器 -> 输入 -> 附加依赖项设置为:

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

和链接器 -> 常规 -> 附加库目录到:

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

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

更新 2

打开 C:\Program Files\ImageMagick-6.6.6-Q16\lib 中的 .lib 文件会导致此错误: 替代文字

更新 3

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

更新 4

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

4

4 回答 4

3

CORE_RL_Magick++_.lib 包含 ?InitializeMagick@Magick@@YAXPBD@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 神器,不确定它是如何工作的。

于 2010-12-21T16:19:19.160 回答
2

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

在链接器-> 输入-> 附加依赖项中

编辑:并把魔法库的路径

在链接器 -> 常规 -> 附加库目录中

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

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

我错了 Dependency Walker 没有打开 .lib,只有 Dll 和 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++ 时对其的理解有所不同。(这就是为什么我需要查看函数的原型)

于 2010-12-21T12:28:42.753 回答
0

The documentation says: "Windows users may get started by manually editing a project file for one of the Magick++ demo programs." Did you try that?

于 2010-12-21T13:07:31.423 回答
0

您还应该向 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;C:\Program Files\ImageMagick-6.6.6-Q16\lib\CORE_RL_Magick++_.lib

它仍然不起作用。它是错误的 .lib 文件吗?

这个 .lib 文件是干什么用的?源代码不应该正常工作吗?没有DLL...

于 2010-12-21T12:41:05.267 回答