アプリ版:「スタンプのみでお礼する」機能のリリースについて

error LNK2019: 未解決の外部シンボル __imp__○@4 が関数 _○ で参照されました
すべてのエクスポート関数について、上記と同じエラーとなります。
「@4」等、DEFファイルに記述されたエクポート番号までは捉えているのにエラーとは何事でしょうか。

Microsoftのアンサーを見ても理解できません。

ツール:VisualStudio2010のMFC

小生の知識
DLLとリンクする場合、○.libファイルとエクスポート関数を定義する○.hファイルがあればよい。これまで、この考え方でうまくできていました。
他社のICのドライバにおいて、コンパイル・リンクで苦労したことはありません

困りました。
FTDI社のFT232HでSPI-USB変換を目論んで、多数のファイル、サンプルプロジェクトをダウンロードしました。
サンプルプロジェクトを生のまま、VisualStudio2010にかけると問題なく成功します。

ソースを切り取って、こちらのアプリ(MFCのダイアログベース)に利用します。
(このやり方で、他社のドライバでは成功しています)

結果、コンパイラは通るが、リンクで関数が存在しないとなります。
libMPSSE.dll、libMPSSE.lib、libMPSSE_spi.h :○.dll、○.lib、○.h 揃っています。
VisualStudioのツールDumpbin /exportsでlibMPSSE.dllを見ると確かにエクスポート関数が存在するのが見えます。(ただし、libファイルは不明です)

ところで○.hを見ると
#ifdef FTCSPI_EXPORTS
#define FTCSPI_API __declspec(dllexport)
#else
#define FTCSPI_API __declspec(dllimport)
#endif
はなんでしょうか。初めて見るものです。関係しているでしょうか。

#ifdef __cplusplus
extern "C" {
#endif
、、、、、、、
#ifdef __cplusplus
}
#endif
はなんとなくわかります。また他に他社のドライバと目立った違いはないようです。

A 回答 (1件)

VisualStudio2010 は使用した事ありませんが、


どこかリンカの設定に詳細メッセージを吐く項目が有るはずなので、そこを活かしてみると、閲覧者にも状況が判ると思います。

一応、私が見て前提にしている事は、
・アプリ(MFCのダイアログベース)では libMPSSE_spi.h をインクルードしている。
・また、libMPSSE.lib はアプリから参照出来る位置に配置・定義されている。
です。

なお、○.dll、○.lib、○.h はおそらく雛形ですからプロジェクトから外した方が良くないですか? 回答側から見て混乱するだけなので…
    • good
    • 0
この回答へのお礼

<<どこかリンカの設定に詳細メッセージを吐く項目が有るはずなので、そこを活かしてみると、閲覧者にも状況が判ると思います。>>

davidfox 様、よいヒントをありがとうございました。

リンカーオプションを眺めますと、
リンカの設定に、「進行状況の表示」があり、「詳細情報をすべて表示 (/VERBOSE)」と設定すると、多数の詳しいメッセージが出ました。

これをヒントにして、考えて、

1.リンカの設定に「対象コンピュータ」を選択する所があって、デフォルトでは「MachineX86 (/MACHINE:X86)」となっていて、これはBADでした。
これを「MachineX64 (/MACHINE:X64)」に設定します。

2、「ビルド」 - 「構成マネージャ」― 「プラットホーム」でデフォルト の「Win32」になっているものを、「X64」に変更します

以上、2点を設定することで、エラーが出なくなりました。

結論は、○.libは64bit版で作られていたということになります。

FTDI社は、64bit版のみを提供していた。もし、32bit版も同時提供していたら、小生は気づかずに32bit版を作っていたことでしょう。現実に32bit版でも64bit上で動くので、自分では64bitアプリを作ったつもりになっていたでしょう。

お礼日時:2015/06/30 06:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!