Delphi プロジェクトから関数を呼び出す目的で、Visual Studio 2012 で DLL プロジェクトを作成しています。関数を extern "C" { /* ... */ } でラップして、C++ 名マングリングを既に無効にしていますが、C 名の装飾を避けるために、DEF ファイルを使用しています。
これは、私がどのようにレイアウトしたかを説明するコードのスニペットです。
// MyFile.h
#ifdef MYPROJECT_EXPORTS
#define MYPROJECT_API __declspec(dllexport)
#else
#define MYPROJECT_API __declspec(dllimport)
#endif
extern "C" {
extern MYPROJECT_API void __stdcall do_something();
}
.cpp ファイルは同等の構造です。すべてがうまく一致します。
次のコンテンツを含む .def ファイルをプロジェクト フォルダーに追加しました。
LIBRARY MyProject
EXPORTS
do_something=_do_something@0
プロジェクトをビルドすると、すべて正常に動作します。ただし、リンカーオプションを追加すると
/DEFS:MyProject.def
未解決の外部シンボルに関するエラーが発生し始めました。誰もこの種の問題を以前に経験したことがありますか? 私は C++ も C も初めてではありませんが、主に Unix 開発者であるため、Windows で DLL を構築するのはこれが初めてです。私の仮説は、__declspec デコレーターを誤解しているか、誤用しているということです。これは、def ファイルにリンクするときにのみ機能しなくなるためです。リンカー オプションからそのフラグを削除すると、C スタイルの装飾されたシンボルを除いて、きれいにビルドされます。
編集: コメントありがとうございます。私の問題は、DLL の作成中のリンク段階で def ファイルを使用していたことが原因でした。DLLを作成するのではなく、DLLを使用するときにdefファイルを使用する必要があり、すべてが桃色です。