关于在linux下用gcc编译头文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于在linux下用gcc编译头文件相关的知识,希望对你有一定的参考价值。

有node.h prepare.h list.h file.h 这四个头文件, prepare.h中用到了node.h, list.h中用到了preapre.h , file.h中用到了list.h ,怎么用gcc对这四个头文件进行编译。

首先,确定你的头文件都用宏隔开了,防止了重复定义。例如,在file.h 中的开头就是
#ifndef __FILE__HEAD___
#define __FILE__HEAD___
//头文件中的内容
#endif //__FILE__HEAD___
之后,
file.h中用到了list.h ,所以file.h中#include "list.h"//假设头文件都在同一目录下
list.h中用到了preapre.h 所以list.h中#include "prepare.h"
prepare.h中用到了node.h 所以prepare.h中#include "node.h"

在某些情况下,由于代码组织等的问题,还是会出现编译问题,这个就是代码组织技巧的问题了,要根据具体代码具体判断了。
另外,准确的说头文件只是在编译的第一步,预处理的时候使用了,真正被“编”的应该是源文件,这个是编译原理方面的问题了。
参考技术A 这个是 C 语言基础要求……
不管哪个 C 语言,都要求必须引用使用中的函数的定义头文件。

Virual Stdio 的 C 模板最开头已经自动加上了引用头文件了,这个头是个万能头文件,他会继续引用大部分基础头文件……如果选择托管的代码,只要设置好引用库就不需要自己再加什么,编译器会自动去继承类。
但这仅限于小程序,大程序还是需要自己引用一些头文件的。

本来根据 C 标准规定,所有的函数都必须提前声明。包括最最最最最最常用的函数也要提前声明。
但为了方便,部分函数是不需要声明就可使用的,这些函数都是基础函数。

printf() 就是这么一个常用的函数,一般他的定义在 stdio.h 里。这个头文件里面的函数很多都是常用函数,编译器会自动引用。
所以你不 #include 声明他的头文件时,你的源代码依然可以继续编译并且可以运行。

#include <xxxxx.h> 和 #include "xxxxx.h" 理论上都是可以用的。但大家分开区别两个类型的,记得是 < >包含的是系统头文件,"" 包含的是自带头文件。

现在所有的 C 代码都要 include 需要的所有函数的头文件,这是一个标准写法。
尤其是 Linux 下面,不同的软件包,会提供不同的同样名字的函数,如果不引用,容易导致混乱。

gcc 的警告输出不是错误,但如果你想编写一个肯定不会出问题的程序,那么没有警告输出的 C 源代码才是好代码。
参考技术B 头文件都是源码存放,include过这些头文件的代码,在编译时gcc会自动加进,但是要保证路径和文件都存在。

百度问答linux Ubuntu 下用GCC编译“HELLO WORLD “出现错误。如下所示

#include<iostream>
using namespace std;
int main()

cout<<"HELLO WORLD"<<endl;
return 0;


结果如下:
ymy@ymy-ubuntu:~/ctest$ gcc -o shi shi.cpp
/tmp/ccG7Dx59.o: In function `main':
shi.cpp:(.text+0xa): undefined reference to `std::cout'
shi.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
shi.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
shi.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccG7Dx59.o: In function `__static_initialization_and_destruction_0(int, int)':
shi.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
shi.cpp:(.text+0x59): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
ymy@ymy-ubuntu:~/ctest$
这是为什么?

这个是C++程序,因此你需要安装g++编译器才行
安装:sudo apt-get install g++
编译:g++ shi.cpp -o hello就会编译一个hello的可执行文件~~~
参考技术A 1楼对的。需要安装g++包。
你最好安装 build-essential,这样编译环境基本都全了。
参考技术B gcc是C语言编译器,不是C++编译器。

以上是关于关于在linux下用gcc编译头文件的主要内容,如果未能解决你的问题,请参考以下文章

arm-linux-gcc工具链:汇编文件如何include c的头文件呢???

在Linux下用gcc编译hello world

在cygwin下用gcc编译一个程序的详细步骤,求详解

问一下,为啥代码在RedHat里面gcc编译出错,提示找不到module.h等头文件

arm-linux-gcc怎么编译自己写的头文件

如何解决gcc编译c程序找不到头文件的问题