7

VS2010 の C++ プロジェクトに ImageMagick Magick++ を使用しようとしています。ここからライブラリをインストールしました: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

私は何を間違っていますか?

どうもありがとうございました!

アップデート:

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;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@@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 アーティファクトかもしれませんが、それがどのように機能するかはわかりません。

于 2010-12-21T16:19:19.160 に答える
2

また、リンクに使用する.libを Visual Studio に示す必要があります。

リンカ -> 入力 -> 追加の依存関係

編集:そして魔法のライブラリのパスを入れてください

リンカー -> 一般 -> 追加のライブラリ ディレクトリ

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は 2 つの異なる署名です。<Magick++.h>Visual C++を含めると、その認識が異なります。(そのため、関数のプロトタイプを確認する必要があります)

于 2010-12-21T12:28:42.753 に答える
0

また、リンカー->入力->追加の依存関係でリンクに使用する.libをVisualStudioに指定する必要があります

ありがとうございました!追加の依存関係の行には、次のテキストが含まれています(最後を見てください):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 に答える
0

ドキュメントには、「Windows ユーザーは、Magick++ デモ プログラムの 1 つのプロジェクト ファイルを手動で編集することから始めることができます」と記載されています。あなたはそれを試しましたか?

于 2010-12-21T13:07:31.423 に答える