1

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ファイルを使用する必要があり、すべてが桃色です。

4

1 に答える 1