0

我正在构建一个 DLL 来包装要从 matlab 调用的 C/C++ 库。

我正在使用标准__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 比较陌生,所以让我看看我是否可以用一种有意义的方式来解释这一点。

该解决方案有多个项目。一个项目被调用MatlabDLL,主项目被调用OurLibrary。Matlab DLL 不会导入所有库,只是将其中的一部分包装到 Matlab 中。在许多情况下,Matlab DLL 可以轻松地直接调用 C 函数,在其他情况下,必须重写函数以处理 Matlab C/DLL 调用语义。

因此,BAR必须有一个特定于 Matlab 的 C 包装器才能从 Matlab 调用它。相关的源文件 bar.cpp 位于 MatlabDLL 项目中。(在后台,BAR调用了一些函数,其源代码位于OurLibrary项目中,而它们的源文件都不在 MatlabDLL 项目中。)

FOO有一个不需要 C 特定包装器的实现,因此 foo.cpp 位于OurLibrary源代码树的一部分,并且在MatlabDLL项目中没有源文件,尽管它的关联.h文件由MatlabDLL.h.

最后,VS2010 似乎只构建了项目中具有关联文件的__declspec(dllexport)'d 函数。c添加foo.c到项目中解决了这个问题。

于 2013-07-30T19:07:17.437 回答