C++ で記述された DLL があり、いくつかのエクスポートされたメソッドの名前マングリングを抑制したいと考えています。メソッドはグローバルであり、どのクラスのメンバーでもありません。これを達成する方法はありますか?
ところで:私はVS2008を使用しています。
C++ で記述された DLL があり、いくつかのエクスポートされたメソッドの名前マングリングを抑制したいと考えています。メソッドはグローバルであり、どのクラスのメンバーでもありません。これを達成する方法はありますか?
ところで:私はVS2008を使用しています。
関数定義を extern "C" {} で囲みます。
extern "C" {
void foo() {}
}
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.htmlを参照してください。
EXPORTS セクションを含む .def ファイルを使用すると、エクスポートされた関数のマングリング (C++、cdecl、stdcall など) をすべて回避できます。MyDll.def ファイルを作成してプロジェクトに追加するだけです。
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
実際には、ウィザードがすでに定義ファイルを作成している可能性があります。EXPORTSセクションに記入するだけです。
「bradtgmurray」は正しいですが、Visual C ++コンパイラの場合は、とにかく関数を明示的にエクスポートする必要があります。しかし、「Serge --appTranslator」によって提案された.DEFファイルを使用することは、それを行うための間違った方法です。
装飾されているかどうかに関係なく、CコードとC ++コードの両方で機能するdeclspec(dllexport / dllimport)命令を使用します(一方、コードを手動で装飾する場合を除き、.DEFはCに制限されます)。
したがって、Visual C ++で装飾されていない関数をエクスポートする正しい方法は、「bradtgmurray」で回答されたエクスポート「C」イディオムとdllimport/dllexportキーワードを組み合わせることです。
例として、Visual C ++で空のDLLプロジェクトを作成し、2つの関数を作成しました。1つは装飾されているためCPPと呼ばれ、もう1つは装飾されていないためCと呼ばれます。コードは次のとおりです。
// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;
// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;
すでにご存知だと思いますが、完全を期すために、MY_DLL_APIマクロはDLL makefile(つまり、VCPROJ)で定義されますが、DLLユーザーでは定義されません。
C ++コードは簡単に記述できますが、完全を期すために、以下に記述します。
// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
return 42 * v ;
}
extern "C"
{
// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
return 42 * v ;
}
} ;