我正在构建一个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
不是。
关于如何可能出现这种情况的任何想法?
答案 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
添加到项目中可以解决问题。