Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;标题_C++_C_Linker - Fatal编程技术网

C++ 使用C++;标题

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.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.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未编译或未链接。感谢您的帮助,通过阅读此常见问题解答,我找到了正确的解决方案: