【发布时间】: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