我只是C ++的初学者。我正在尝试构建一些头文件header.h,但输出总是如下所示:
/tmp/ccTmZKXX.o: In function `main':
main.c:(.text+0x13): undefined reference to `func'
collect2: ld returned 1 exit status
你能帮我看一下我使用头文件的方式是否正确吗?非常感谢!
主要代码(main.c
):
#include "stdio.h"
#include "func.h"
main() {
double a = f(2.3);
printf("a=%f\n", a);
}
func.c
包含:
double func (double x) { return x ;}
func.h
包含:
double func (double);
我编译:
gcc -o main main.c
答案 0 :(得分:5)
这里有很多问题:
GCC(GNU编译器集合)中的C ++编译器是g++
,而不是gcc
;后者是GNU C编译器。
main.c
中的代码是一个(不是很好的)C程序,而不是C ++程序。 C99禁止隐式int
返回类型; C ++基本上从不允许它。
您的问题使用函数f
;编译错误引用func
。这意味着您没有向我们展示您尝试编译的代码。
标准说#include <stdio.h>
;你也应该。
#include <stdio.h>
#include "func.h"
int main()
{
double a = func(2.3);
printf("a=%f\n", a);
}
NB :如果您使用C99,这是一个非常好的C程序。在C89中,您应该从main()
返回一个值,而不是从最后一刻开始。#39; C99遵循C ++ 98并允许从结尾处掉头等同于显式return 0;
。无论如何,我倾向于使用明确的return(0);
(通常有,有时没有括号 - 编译器也不介意)。 (我使用-Wstrict-prototypes
编译C;为了获得无警告编译,我写了int main(void)
,它也适用于C ++,但那里不需要void
。)
标题还可以,但您将在适当的时候了解header guards以及其他使标题更可靠的随身物品。
#ifndef FUNC_H_INCLUDED
#define FUNC_H_INCLUDED
extern double func(double a);
#endif /* FUNC_H_INCLUDED */
extern
不是强制性的。我倾向于使用它,但有许多人没有使用它。
定义函数的源文件应包含标头,以确保函数定义与声明一致。使用该函数的所有代码都应包含标题,以便在范围内有原型。这种交叉检查对可靠性至关重要。在使用函数之前,C ++需要范围内的原型;在定义函数之前,它不要求范围内的原型(但这样做是好的做法)。在C中强烈建议您在定义外部(非静态)函数之前使用范围内的原型。您可以将-Wmissing-prototypes
与C代码和GCC一起使用来发现此类问题,但该选项对G ++无效。
#include "func.h"
double func(double x) { return x; }
由于这是一个C ++问题,我们可以考虑在标题中内联函数。实际上,C99还支持inline
函数。但是,我们暂时可以忽略它。
由于这是一个C ++问题,我们可以认为使用<stdio.h>
并不好,因为它不是类型安全的。使用<iostream>
等可能会更好,尤其是因为它们是类型安全的。
#include <iostream>
#include "func.h"
int main()
{
double a = func(2.3);
std::cout << "a=" << a << std::endl;
}
正确的编译需要主程序和它调用的函数,所以你可以写:
g++ -o main main.c func.c
或者,如果您在C中编译它,那么:
gcc -std=c99 -o main main.c func.c
请注意,-std=c99
是必要的,以确保return
中main()
的缺席是可以接受的。
请注意,C ++源代码有几个扩展,包括.C
,.cpp
和.cxx
,所有这些扩展都被G ++接受(以及{{1} })。
答案 1 :(得分:4)
这里有几个问题。
在func.h中定义函数如下
extern double func(double);
编译时,提供所有源(c,cpp)文件
gcc main.c func.c -o main
你应该好好去。
答案 2 :(得分:1)
像这样编译:
gcc -o main main.c func.c
然后就没事了。