2011-09-30 8 views
2

DLLラッパーを作成するMSVC2010にC++コードのセクションがあります。コードのセクションでは、このような何か...awkward DLLエクスポートセクション

extern "C" __declspec(dllexport) DWORD myDllExportFunction() 
{ 
    return (DWORD)SomeFunction(SomeParameter); 
} 

か...

_declspec(dllexport) int64 _stdcall myDllExportFunction2(<someType> someParameter){ 
{ 
    return new (DWORD)SomeExternalFunction(SomeParameter); 
} 

に見える私は、完全修飾関数名を含むように、このDLLにDUMPBINをやってから、私の輸出セクションを期待しますしかし、それはこのように見える。

[email protected] = [email protected] 

なぜこの等号があるのか​​、それが何を意味するのかわかりません。私は、それが想定していないようにdllをインポートするプログラムが関数にアクセスできないという強い感情を持っています。

/Zi /nologo /Wall /WX- /O2 /Ob2 /Oi /Oy- /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc 

リンカオプション:

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\....\MyProj.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\....\MyProj.pgd" /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT:NO /IMPLIB:"MyProj.lib" /MACHINE:X86 /ERRORREPORT:QUEUE 

注:/ IMPLIB:

は、十分な情報を提供するために私は私のコンパイラとリンカスイッチ

コンパイラオプションの一部が含まれていました」 MyProj.lib " - >このインポートライブラリには、DLL内にすべてのエクスポートが含まれています。これらのエクスポートは、DLL内の書式で使用します。

この問題の原因になるプロジェクト設定には何らかの設定がありますか?私が見逃していたかもしれない過去数年間にdllexportに変更がありましたか?自分の問題を理解するのに役立つ情報がありますか?

+1

出力を減らすために.pdbファイルを削除してください。 –

答えて

3

デバッグ情報の生成を無効にしてみてください。

enter image description here

+0

これは、エクスポートされた関数の名前には影響しません。 –

+0

@BenVoigtこれは実際に私が問題で説明していたエラーでした。 +1(ただし、十分ではない担当者):*( – Satyrn

0

あなたはおそらく別の宣言で、それ__stdcall宣言することで名前をマングルしています。名前マングリングを避けるには、__cdecl呼び出し規約を与える必要があります。

+0

'__cdecl'は名前のマングリングを避け、ルールを変更するだけです。 –

+0

@BenVoigtこれは実際に試したときにマングリングを削除するように見えましたが、 – Satyrn

+0

@Ben:それは名前のマングリングに影響を与えることができます:http://msdn.microsoft.com/en-us/library/x7kb4e2f.aspx –

0

エクスポートされた関数の名前を制御する(たとえば、マングリングを削除する)場合は、リンカーmodule definition (.def) fileを使用する必要があります。

+0

名前のマングリングを削除する必要はありませんが、これを試してみましたが、Cクラスでこれらのメソッドが見つからないというリンカーエラーが発生します。ここにdefファイルの例を示します。[code] LIBRARY myProjectname EXPORTS "myDllExportFunction @ 12" – Satyrn

+0

@Satyrn: 'LIBRARY myProjectname EXPORTS myDllExportFunction'のように.defファイルに関数名を入れてください。 。引用符なし、スタックサイズの注釈なし。おそらく、 'EXPORTS myDllExportFunction = _myDllExportFunction @ 12'が必要かもしれませんが、通常、リンカーはそれを示しています。先頭のアンダースコアに注意してください。 –

+0

私は別の人の答えで解決策を見つけましたが、単にdefファイルを使用しようとするとLNK2001エラー "解決されていない外部シンボル"が表示されました。私はそれぞれの機能のdefファイルでmanglingという名前を削除しました。 – Satyrn

0

名前のマングリングを防止するためのオプションがいくつかあります。

  • 変更__cdecl__stdcallからエクスポートされた関数の宣言指定。あなたは名前の符号化を回避するために、次の2つの方法のいずれかを__stdcall呼び出し規約の使用を使用する必要がある場合ので、関数のシグネチャは この

    extern "C" DWORD __declspec(dllexport) __cdecl myDllExportFunction()

のようになります。どちらの場合も、関数定義に__declspec(dllexport)を追加する必要はありません(ただし、そうしても問題ありません)。

  • a。>コマンドライン - DEF リンカに行き、ライン

LIBRARY YourLibraryName
輸出プロジェクトのプロパティで
        myDllExportFunction

  • を含むプロジェクトにファイルを編集ボックスに追加オプション add /export:myDllExportFunction
+0

エクスポートされた関数のリストは、同じ行ではなく、 'EXPORTS'キーワードの下にあると思います。そして、 '__cdecl'関数名は引き続き先頭にアンダースコアがついています。 –

+0

@BenVoigtありがとう、あなたはdefファイルの構文について正しいです。しかし、 '__cdecl'関数名には先頭のアンダースコアがついていません。私の前には何も証明していない作業プロジェクトがあります。 – Praetorian

+0

x86またはx64。それもルールを変えます。 http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows –