2010-01-19 67 views
1

我从Visual C++代码生成了一个DLL。依赖Walker将3个函数导出为C函数。DLL:作为C/C++函数导出?

我做了一个SCons项目来生成DLL,并且3个函数中的2个不被视为C函数。

什么使函数看作是一个或C++函数,而不修改代码?它必须在编译/链接选项中,但我没有找到任何相关的东西。

功能由宏前缀:AM_LIB_EXPORT

在.H,我有:

#ifdef _WIN32 
#define AM_LIB_EXPORT __declspec(dllexport) 
#else 
#define AM_LIB_EXPORT 
#endif // _WIN32 

感谢。

+1

看看(http://en.wikipedia.org/wiki/X86_calling_conventions) – lsalamon 2010-01-19 15:18:25

+0

你确定使用scons编译时定义了_WIN32吗? – 2010-01-19 15:39:17

回答

3

是什么让函数看作一个或C++函数,而不修改代码?

由C++编译器编译的函数自动为'C++函数',并且会出现名称重组以解决C++特性(如命名空间和重载)。 为了获得'C'导出名称,必须在函数声明中使用上述extern "C"限定符。或者在包含原型的头部周围有一个巨大的extern "C" { .. }块。

如果这不能解决您的问题,它可能与dllimport/dllexport有关。如果您的DLL构建中有#define AM_LIB_EXPORT __declspec(dllexport),那么通常还需要为其链接到DLL的应用程序创建dllimport,以便链接程序知道从哪里获取符号。

3

这是一个名称的问题吗?如果你在函数声明的周围没有使用extern "C",它们会得到名称错误。

0

我发现的原因:

出口也被加入作为其它附加命令行选项(/出口)。在这种情况下,它被导出为C函数。我不明白为什么...

我删除了这个额外的命令行开关。

谢谢大家。

我仍然不知道如何将线程标记为“已解决”?

+0

点击好回复上的刻度标记 – pm100 2010-01-19 17:29:53

+0

谢谢。我很想剔除自己。 – Oodini 2010-01-19 18:07:26