【问题标题】:Calling a C++ Function from C Program从 C 程序调用 C++ 函数
【发布时间】:2018-11-28 09:37:25
【问题描述】:

我正在努力将一个用 C++ 编写的函数添加到一个用 C 编写的大型程序中。

我尝试将 C 程序中包含的所有代码都包含在 extern "C" 块中,但是当我使用 g++ 编译时,我仍然收到来自编译器试图将 C 编译为 C++ 的错误。我已将 extern "C" 块添加到所有头文件和 .c 文件中,如下所示:

#ifdef __cplusplus
extern "C"
{
#endif

//C code here

#ifdef __cplusplus
}
#endif

错误如下所示:

./sortcodes/oci.c: 在函数'int GetSpecList(ClientData, Tcl_Interp*, int, Tcl_Obj* const*)': ./sortcodes/oci.c:188:25: 错误: ‘init’没有命名类型 静态初始化=真;

如果我删除我的 C++ 函数调用并仅使用 gcc 编译 C 程序,则不会发生这些错误。

如果我删除 extern "C" 块并使用选项进行编译

gcc -std=c++0x -lstdc++ -std=c++11

我收到如下错误,其中 C++ 标志显然被忽略了

./Event_Reader.cpp:9:20:致命错误:iostream:没有这样的文件或目录 #包括

是否有我遗漏或误解的选项?任何建议将不胜感激。

【问题讨论】:

  • 请一些minimal reproducible example,并解释所有你的编译命令。所以edit你的问题来改进它
  • 要构建您的 C++ 源代码,您需要使用 g++。继续使用gcc 构建C 源代码。
  • 好像你的错误与extern "C"无关,init的类型不见了,见./sortcodes/oci.c:188:25: error: ‘init’ does not name a type static init=TRUE;
  • @NikolaySosnin 似乎是该文件中的语法错误,与外部链接无关。 static init=TRUE; 完全错误,因为缺少类型,请将其更改为 static int init=TRUE; 或其他类型
  • @Korni 除了它没有添加 C++ 标准库头文件的路径。这是 OP 的问题之一。

标签: c++ c makefile linker legacy


【解决方案1】:

首先,要编译 c++ 代码,您必须使用 c++ 编译器,例如 g++ 或 clang++。然后,您需要使用extern "C" 链接声明所需的c++ 函数。此时您可以从 C 代码中调用该函数。 具体例子请参考How do I call a C++ function from C

【讨论】:

  • 错了,正如我在上面的 cmets 中所说:gcc 完全没问题,因为 gnu 会自动通过文件扩展名 .c 、 .cpp 确定语言
  • @Korni 当然,gccg++本质上是相同的软件,但如果您使用 gcc,则需要显式链接到标准模板库.简单地使用g++clang++ 会更容易。我的回答强调c++ 代码必须由c++ 编译器编译...
  • 我试过用 g++ 编译。但是我在所有 C 代码中添加了外部“C”。它应该在 .cpp 中吗?
  • @NikolaySosnin 在 c++ 源代码中,您必须声明 extern C 只有要在 C 代码中使用的 c++ 函数。然后在 C 代码中你必须提供一个声明(没有extern C)。请查看链接。
  • @francesco 该链接帮助很大,谢谢!将 extern "C" 移动到 .cpp 并在使用它的 C 代码的顶部声明它已经解决了编译问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多