【发布时间】:2023-10-09 22:15:01
【问题描述】:
我正在尝试包含一些我在 C++ 项目中找到的 C 代码。该函数在 C 文件中是这样定义的。
#ifdef __cplusplus
extern "C" {
#endif
extern char *dtoa(double, int, int, int *, int *, char **);
extern char *g_fmt(char *, double);
extern void freedtoa(char*);
#ifdef __cplusplus
}
#endif
char *
g_fmt(register char *b, double x)
{
我包含在其中的 VS 项目正在创建一个 dll。该文件正在编译为 C,项目中的其他文件正在编译为 C++。
我添加了一个标头以包含在我的 C++ 文件中
#ifndef G_FMT_H
#define G_FMT_H
#ifdef __cplusplus
extern "C" {
#endif
extern char *dtoa(double, int, int, int *, int *, char **);
extern char *g_fmt(char *, double);
extern void freedtoa(char*);
#ifdef __cplusplus
}
#endif
#endif //G_FMT_H
在解决方案的另一个项目中,我包含我的标题并尝试调用 g_fmt 函数。
#include "header.h"
...
g_fmt(my_array, 2.0);
这个项目正在链接到另一个项目,我可以毫无问题地调用第一个库中的 C++ 函数。但是,添加上面的行会给我一个 lnk2001 错误。
error LNK2001: unresolved external symbol g_fmt
我发现了许多其他关于混合 C 和 C++ 的问题,我似乎已经在正确的地方使用 extern 关键字完成了所有必要的事情,但是我仍然无法链接。在 VS2010 中我需要做什么具体的事情吗?
【问题讨论】:
-
所以你可以使用 dtoa 但不能使用 g_fmt?
-
不,我的意思是我可以使用在同一个库中其他地方声明的 C++ 函数。我在其他帖子中读过,您可以在同一个项目中混合使用 C 和 C++,也许这不太正确?
-
确实如此,重点是如何导出函数?通常你需要一个 __declspec(dllexport) 或一个 def 文件。你这里用什么方法?
-
链接器正在寻找实际函数的目标代码(或导入库存根)。它没有查看头文件或 C++ 源代码——编译阶段已经过去。那么
g_fmt函数实际实现在哪里呢?是在图书馆吗?
标签: c++ c visual-studio-2010 extern lnk2001