1

我用 C++ 代码在 Visual 中生成了一个 DLL。Dependency Walker 看到 3 个函数导出为 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

谢谢。

4

3 回答 3

4

是什么让一个函数被视为一个或 C++ 函数,而无需修改代码?

由 C++ 编译器编译的函数会自动成为“C++ 函数”,并且会发生名称修改以解析 C++ 功能,例如命名空间和重载。为了获得“C”导出名称,必须extern "C"在函数声明中使用上述限定符。extern "C" { .. }或者,包含原型的标题周围有一个巨大的块。

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

于 2010-01-19T16:52:45.747 回答
3

这是名称修改问题吗?如果你不在extern "C"你的函数声明周围使用,它们将被名称破坏。

于 2010-01-19T15:17:53.823 回答
0

我找到了原因:

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

我删除了这个附加的命令行开关。

谢谢你们。

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

于 2010-01-19T17:23:42.837 回答