質問

私は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セクションに記入する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top