++ネームマングリングをCを抑制するための方法はありますか?
-
05-09-2019 - |
質問
私はC ++で書かれているDLLを持っていると私はいくつかのエクスポート方法のためのマングリングネームを抑制します。方法はグローバルであり、任意のクラスのメンバーではありません。これを達成する方法はありますか?
ところで:私はVS2008を使用しています。
解決
「bradtgmurray」右ですが、ビジュアルC ++コンパイラのために、あなたが明示的にとにかく、あなたの関数をエクスポートする必要があります。しかし、「セルジュ - appTranslator」が提案するよう.DEFファイルを使用すると、それを行うには間違った方法である。
。のVisual C ++?
上のシンボルをエクスポートする普遍的な方法は何ですかdeclspec(のdllexport / dllimportの)CおよびC ++コードの両方のために働く命令、飾らないか(あなたが手であなたのコードを飾るする場合を除きに対し、.DEFがCに制限されている)を使用します。
だから、「bradtgmurray」で答えとして、輸出「C」イディオムを組み合わせているのVisual C ++で装飾されていない関数をエクスポートするための正しい方法、およびDLLIMPORT / DLLEXPORTキーワードます。
例?
例として、私は、Visual C ++空のDLLプロジェクトに作成され、それがなかったので、二つの機能、それが飾られていたので、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のメイクファイル(すなわち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 ;
}
} ;
他のヒント
のextern "C" との関数定義を囲む{}
extern "C" {
void foo() {}
}
http://www.parashift.comを参照してください。 /c++-faq-lite/mixing-c-and-cpp.htmlする
あなたはEXPORTSセクションで.defファイルを使用してエクスポート機能のために、すべてのmanglings(C ++、cdecl規約、STDCALL、...)を回避することができます。ただ、MyDll.defファイルを作成し、プロジェクトに追加します:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
実際には、チャンスは、ウィザードはすでにあなたのためのDEFファイルを作成します。あなただけのEXPORTSセクションに記入する必要があります。