GCC/C++无法链接库 我只是一个C++初学者。我试图构造一些头文件header.h,但输出总是如下所示: /tmp/ccTmZKXX.o: In function `main': main.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status

GCC/C++无法链接库 我只是一个C++初学者。我试图构造一些头文件header.h,但输出总是如下所示: /tmp/ccTmZKXX.o: In function `main': main.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status,c,g++,C,G++,你能帮我看看我使用头文件的方式是否正确吗?非常感谢 主代码Main.c: 其中func.c包含: double func (double x) { return x ;} double func (double); 其中func.h包含: double func (double x) { return x ;} double func (double); 我用以下方法编译: gcc -o main main.c 这里有几件事不对 在func.h中定义函数,如下所示 extern dou

你能帮我看看我使用头文件的方式是否正确吗?非常感谢

主代码Main.c:

其中func.c包含:

double func (double x) { return x ;}
double func (double);
其中func.h包含:

double func (double x) { return x ;}
double func (double);
我用以下方法编译:

gcc -o main main.c

这里有几件事不对

在func.h中定义函数,如下所示

extern double func(double);
编译时,提供所有源c、cpp文件

gcc main.c func.c -o main

你应该可以走了。

这里有多个问题:

< > GCC GNU编译器集合中的C++编译器是G++,而不是GCC;后者是GNUC编译器

<主页中的代码是一个不太好的C程序而不是C++程序。C99禁止隐式int返回类型;C++基本上不允许它。

你的问题使用了一个函数f;您的编译错误引用了func。这意味着您没有准确地向我们展示您试图编译的代码

标准包括:;你也应该

#include <stdio.h>
#include "func.h"

int main()
{
    double a = func(2.3);
    printf("a=%f\n", a);
}
外部代码不是强制性的。我倾向于使用它,但有许多人不这样做

定义函数的源文件应包含头文件,以确保函数定义与声明一致。所有使用该函数的代码都应该包含头,以便在作用域中有一个原型。这种交叉检查对于可靠性至关重要。C++在使用函数之前需要在范围内生成原型;在定义函数之前,它不需要范围内的原型,但这样做是一种良好的实践。在C语言中,强烈建议您在定义外部非静态函数之前在范围内有一个原型。您可以将-Wmissing原型与C代码和GCC结合使用来发现此类问题,但该选项对G++无效

#include "func.h"

double func(double x) { return x; }

由于这是一个C++问题,我们可以考虑在头中内联函数。实际上,C99还支持内联函数。然而,我们暂时可以忽略这一点

因为这是一个C++问题,我们可以认为使用不是很好,因为它不是类型安全的。使用et al可能会更好,尤其是因为它们是类型安全的

#include <iostream>
#include "func.h"

int main()
{
    double a = func(2.3);
    std::cout << "a=" << a << std::endl;
}
或者,如果是用C语言编译,则:

gcc -std=c99 -o main main.c func.c
注意,-std=c99是必要的,以确保主回路中没有回路是可接受的

注意到,C++源代码中使用了几个扩展,包括.c、.cp和.cxx,所有这些都被G++和C.

所接受。 编译如下:

gcc -o main main.c func.c

那么它就可以了。

你所显示的主要功能永远不会调用FUNC……你写C代码,用C扩展名命名文件,但显然试图编译成C++,这也有点令人困惑。你在写C还是C++?选择一个并坚持下去。我终于尝试在我的主.c文件中包含func.c。它现在正在工作。我很抱歉关于C++和C的混淆。下次我会说得更清楚:呃,为什么需要声明函数extern?这有什么作用?外部是可选的,我倾向于使用它,但不是强制性的。否则,你是对的。稍后,您可能会选择将单个源文件编译为对象gcc-c,然后链接对象文件gcc-o program file1.o file2.o…,您可能还需要指定库以及库目录。现在可以了。非常感谢你的帮助@用户1159975永远不要在你的c文件中包含func.c。如果您将其包含在多个文件中,这将破坏所有内容。请阅读Johnathan leffler在其评论中所说的内容,并严格遵守。
gcc -o main main.c func.c