web-dev-qa-db-ja.com

VC ++のリンカーで__imp__プレフィックスを削除するにはどうすればよいですか?

Libcurlを使用していますが、VC++ 10で次のようなリンカーエラーが発生しています。

1>main.obj : error LNK2019: unresolved external symbol __imp__curl_easy_strerror referenced in function "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl curl_httpget(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?curl_httpget@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z)

関数名の前にあるimpプレフィックスを削除するにはどうすればよいですか?私は正しいライブラリ、正しいパスなどにリンクしています。

38
BeeBand

___imp___プレフィックスは、DLLにリンクするたびに表示されます。静的にリンクされたライブラリにリンクする場合は表示されません。ほとんどの場合、コードはDLL import libに対してリンクされるように生成されますが、代わりに静的libとリンクしています。

インポートされた関数を__declspec(dllimport)でマークすると接頭辞が追加されます-DLLにリンクしない場合、インポートがこれを使用していないことを確認してください。

55
Suma

MSVCのプロジェクトのプロパティで、CURL_STATICLIBプリプロセッサ定義に追加する必要があります

17

ウィザードで生成されたプロジェクトを使用している場合-project properties -> C/C++ -> Code Generation セクション。

デフォルトでは、通常「マルチスレッドDLL」値を持ちます。マルチスレッド/ MTおよびマルチスレッドデバッグ/ MTd値が必要です。

7
Alfishe

__declspec(dllimport)に評価する指定子を持つ関数プロトタイプを定義するヘッダーファイルを使用しています。

これに評価しているステートメントを再定義する(何も設定しない)か、まったく別のヘッダーファイルを使用する必要があります。

通常、次のようなコードが表示されます。

#ifdef FOO_EXPORTS
#define DLLSPEC __declspec(dllexport)
#else
#define DLLSPEC __declspec(dllimport)
#endif

...

DLLSPEC bool foo(int bar);

FOO_EXPORTSを定義してプロジェクトをコンパイルすると、1つのモードが使用され、それなしでは他のモードが使用されます。

5