0

matlab から呼び出される C/C++ ライブラリをラップする DLL を構築しています。

標準__declspec(dllexport)を使用して関数をエクスポートしています。具体的には、基本的に次のようなコードを含む .h ファイルがいくつかあります。

#ifdef __cplusplus 
extern "C" {
#endif

#ifdef _MSC_VER
__declspec(dllexport)
#endif
void FOO();

#ifdef __cplusplus 
}
#endif

次に、lib.hこれらすべての.hファイルを含むファイルがあります。

#include "foo.h"
#include "bar.h"

私のプロジェクト構成は DLL をビルドするようなものですが、謎はBAR()DLL にある (によって検証されたようにdumpbin) ですが、FOOそうではありません。

これがどのように当てはまる可能性があるかについてのアイデアはありますか?

4

1 に答える 1

0

上記の例では、BAR がプロジェクトのソース ツリーに定義されていないことが問題の原因でした。

私は TFS と VS に比較的慣れていないので、これを理にかなった方法で説明できるかどうか見てみましょう。

ソリューションには複数のプロジェクトがあります。1 つのプロジェクトは と呼ばれMatlabDLL、メイン プロジェクトは と呼ばれOurLibraryます。Matlab DLL はライブラリのすべてをインポートするのではなく、Matlab に含めるためにライブラリの一部をラップするだけです。多くの場合、Matlab DLL は C 関数を簡単に直接呼び出すことができますが、Matlab C/DLL 呼び出しセマンティクスを処理するために関数を書き直す必要がある場合もあります。

そのBARため、Matlab から呼び出せるようにするには、Matlab 固有の C ラッパーを配置する必要がありました。関連するソース ファイル bar.cpp は、MatlabDLL プロジェクトにありました。(フードの下では、ソースがプロジェクトにBAR存在する多くの関数を呼び出しOurLibraryますが、そのソース ファイルはいずれも MatlabDLL プロジェクトにありません。)

FOOC 固有のラッパーを必要としない実装があったため、foo.cppOurLibraryはソース ツリーの一部にあり、MatlabDLLプロジェクトにはソース ファイルがありませんでしたが、関連.hファイルは によって参照されていましたMatlabDLL.h

最終的に、VS2010は、プロジェクト内のファイルに__declspec(dllexport)関連付けられている 'd 関数のみをビルドするように見えます。cプロジェクトに追加foo.cすると、問題が修正されました。

于 2013-07-30T19:07:17.437 に答える