2012-03-08 7 views
1

静的ライブラリ「A.lib」には、int foo()という機能が含まれています。私は別のdllがA.libを消費し、機能foo()を使用し、また、他のいくつかの関数をエクスポートする「B.DLLを」と言っています。それは第三のdllで消費することができるように、「C.DLL」と言うB.DLLから(A.libからインポート)機能int foo()をエクスポートすることが可能です。私たちは静的ライブラリを介して利用可能にする機能をエクスポートできますか?

は、私はそれが可能であるかどうかを知りたいかどうか、私はC.DLLからA.libを利用可能にするなどの回避策を望んではいけません。また、これが悪いデザインであるかどうかは関係ありません。

ご理解いただきありがとうございます。

+1

は最低額を生産します混乱の –

答えて

0

はい、可能ですが、どのコード例も言語に依存しています。 A.libが持っていると仮定すると

: - は(たとえばCであなたは、単に同じ名前の関数をエクスポートすることができ、C.DLLはそれが表示されます)

+0

私は私の問題について少し漠然としていたと思います。具体的には、これはVisual Studio C++を使用しているウィンドウで可能ですか?私が見るように私はそうすることができないので - C.dllではB.dll自体がエクスポートするシンボルを使用することができますが、B.dllのエクスポートシンボルとして宣言していますが、fooにアクセスできません。
驚くほど十分に、B.dllでdumpbinを実行するとシンボルfooが表示されることもあります。
ご返信ありがとうございます。
更新:A.libをダイナミックにする、つまりA.libの代わりにA.dllを作成すると、B.dllのdumpbinはfoo()への参照を行います。 – hanra

+0

私は**名前の衝突はコンパイラを少し混乱させるかもしれない、あなたは同じプロトタイプの関数のために__declspec(export)と__declspec(import)を持っていると思います。私は、CからAへの依存関係を追加できない場合は、関数名を変更する必要があると思います。 –

+0

私はそれに従うかどうかわかりません - * A.lib *の関数名を変更しますか?また、関数fooが* B.dll *のdumpbinには表示されないことを再度強調します。 – hanra

0

私は同じ要件を持っていただけで別の解決策を見つけましたああちょうどああに以下を追加し、(それは、ソースファイルによって消費されるB.DLLを構築するために使用される例えばああA.libに含まれる関数のプロトタイプが含まれていることを仮定して):

#pragma comment(linker, "/export:_foo") 

これは、にリンカに指示しますB.dllをビルドするときにfoo()をエクスポートします。先頭のアンダースコアに注意してください。これは、A.libに含まれているfoo()のシンボルの本当の名前です(それを見るにはdumpbin /symbols A.lib | findstr fooを使用してください)。私の例ではfoo()__cdecl呼び出し規約を使用していたが、あなたは__stdcall()を使用するか、またはC++としてコンパイルする場合は、別の名前の装飾を取得しますので、あなたは結果として上記#pragma声明を調整する必要があります。

A.hがB.DLLの多くのソースファイルに含まれますかどうかは関係ありません - まったく同じ定義が複数回行われた場合、リンカは文句はありません。明示的に輸出を宣言する.defファイルを使用して

このアプローチの一つの「利点」は、あなたもA.libでfoo()__declspec(dllexport)指定子を使用する必要がないことです...

関連する問題