C++ 使用C++;标题
我正在学习一个介绍教程 我已经创建了源文件main.c、counteric.cpp和counteric.hpp。我已经能够成功地编译这些文件。当我去链接它们并收到以下错误消息时,就会出现问题:C++ 使用C++;标题,c++,c,linker,C++,C,Linker,我正在学习一个介绍教程 我已经创建了源文件main.c、counteric.cpp和counteric.hpp。我已经能够成功地编译这些文件。当我去链接它们并收到以下错误消息时,就会出现问题: main.o: In function `main': main.c:(.text+0x30): undefined reference to `reciprocal' collect2: ld returned 1 exit status 我想这可能是因为没有正确地使用头文件,但是我真的不知道应该尝试
main.o: In function `main':
main.c:(.text+0x30): undefined reference to `reciprocal'
collect2: ld returned 1 exit status
我想这可能是因为没有正确地使用头文件,但是我真的不知道应该尝试什么,因为我已经完全遵循了这些步骤
如果有人知道为什么会犯这样的错误,我会非常感激
谢谢
**更新
以下是三个源文件的代码:
main.c
#include <stdio.h>
#include "reciprocal.hpp"
int main (int argc, char **argv) {
int i;
i = atoi(argv[1]);
printf("The reciprocal of %d is %g\n", i, reciprocal(i));
return 0;
}
自从最初发布以来,我实际上已经修改了recipal.hpp。我所做的唯一更改是从函数签名中删除extern关键字。它以前读过
extern double reciprocal(int i);
这一更改允许我链接程序,现在我可以运行它了。我认为可能发生的是,第二个外部正在覆盖第一个外部。如果有人对此有任何见解,我很想知道
谢谢大家的帮助。
< P>当你把C和C++代码混合在一起时,你会遇到麻烦,因为这两种语言有不同的联系。也就是说,如果您要为编译的C和C++文件打开对象文件,您会发现这些对象文件的名称是不同的。 特别是,C++编译器倾向于使用名为“Mang-FLUGLE”的技术,其中函数名与它们的参数类型的额外信息混合。例如,函数char foo(int);
实际上可能有内部名称
char@foo@int
在生成的对象文件的内部。问题是C代码不这样做,所以如果编译了一个C文件,并试图引用一个名称“代码> Foo< /Cord>”,链接器就找不到它,因为生成的C++文件中函数的名称是<代码>。char@foo@int而不是foo
修复这个,C++有一个特性,允许你明确地告诉链接器不把名字加错,使生成的代码看起来像是C程序所需要的。为此,可以声明这样的C++函数:
extern "C" char foo(int);
extern "C" {
reciprocal definition...
}
现在,生成的对象文件将包含名称foo
,而不进行修饰,与C代码所期望的方式兼容
修复问题,尝试在C++源文件中添加一个代码“>代码”>“代码”>“代码> >”。
<> >注意:如果你有一个混合C和C++代码的项目,你应该总是把<代码>主< /Cuff>函数编译成C++代码。C++将额外的初始化和清除代码引入到C代码中不存在的可执行代码中。如果将main
编译为C代码,那么这个额外的逻辑可能不会添加到程序中,因此在运行时可能会出现无法解释的崩溃
希望这有帮助 >将C++文件链接到C文件是最困难的。C++“Mulle”这个名称,这样就可以发生重载。 您可以通过如下方式封装交互定义来防止损坏:
extern "C" char foo(int);
extern "C" {
reciprocal definition...
}
但是如果你这么做,你最好用C写
你能制作一个main.cpp文件吗?看起来像是你的
互惠文件的内容。hpp
无效,可能是#ifdef
行中的一个打字错误,u cplusplus
拼写正确吗(应该有两个下划线)?你能为你自己的文件提供代码吗?你能告诉我们你用哪一行来编译这个吗?听起来好像Interactive.cpp未编译或未链接。感谢您的帮助,通过阅读此常见问题解答,我找到了正确的解决方案: