在VS2010中哪些函数导出到DLL中?

时间:2013-07-26 16:16:10

标签: visual-studio-2010 dll dllexport

我正在构建一个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不是。

关于如何可能出现这种情况的任何想法?

1 个答案:

答案 0 :(得分: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)文件的c'd函数。将foo.c添加到项目中可以解决问题。