Linux源码编译(一):从头文件说起
2013-09-17 09:36
253 查看
原文地址:http://blog.chinaunix.net/uid-26838492-id-3170998.html
在Linux体系结构章节中,主要让大家对Linux结构层次有一定的了解,没有过多的长篇大论,力求简结,但其中的每一个细节要点都值得花费很多时间去研究,比如X window架构,驱动模块,文件系统的实现等。对于细节,只能靠大家自己去沉淀和深究,本博客旨在从全局概念上让大家对Linux有更多的认知,系列文章讲完后,希望留给大家的感觉是:不再害怕Linux。
在这一节里,主要和大家理一理Linux下头文件方面的杂碎,从大的方向说,Linux下编程分为两块:
1). 内核开发
2). 用户空间程序开发
1. 内核空间头文件
对于 Linux kernel的程序开发,主要使用C语言,当然汇编语言也是举足轻重,Kernel的开发主要针对哪些方面呢?
1). 硬件驱动模块
2). 内核性能的增强
3). 内核的新功能、新特性
4). 内核bug的fix
......
无论是哪一方面的内核开发,使用的都是内核自身的头文件,而内核的头文件主要有两个目录位置:
当然,除了asm和 linux 这两个主要的头文件目录,还有诸如/usr/include/drm,/usr/include/video,/usr/include/sound等驱动相关的头文件目录。
总之,如果是从事内核开发的话,所有引用的头文件均是来自内核本身,绝不可能使用用户空间的头文件,比如"glibc",“libstdc++"等头文件的引用是不可能出现在内核程序中的。
2. 用户空间头文件
用户空间的头文件杂乱纷繁,随便一个应用程序,几乎都有自己维护的头文件,但尽管如此,有一些最基本、相对底层的头文件或库函数是开发应用程序的基础。
比如,如果想在用户空间编写C语言程序,那么使用的最基本的C库和头文件是由glibc提供的;想在用户空间编写C++程序,其使用的基本库和头文件又是来自于libstdc++。
对于glibc,不仅仅提供了标准的C库,如fopen(), fclose()等, 而且还提供了和内核空间打交道的相关库,如open(), close()等。
不管是glibc提供的C库,还是由libstdc++提供的C++库,想要编写GUI窗口程序,显然不太现实,于是,有了著名的基于C语言的GTK+库和基于C++语言的QT库,这些相对上层的库所做的事情就是为了方便编写GUI程序,对C和C++封装了一层。
除了上面这些编程相关的库或头文件,Linux环境中编程还有很多编程语言,比如Java,Python等。
3. 所谓跨平台
1). 跨平台一般分为:
跨硬件平台:比如Linux内核,即能在x86上运行,也能在ARM或Android上运行
跨系统平台:即能在Linux系统下运行,也能在Windows系统下运行,比如firefox
跨硬件跨系统:比如Java程序,可以在不同的体系结构,也可以在不同的系统平台运行
2). Window环境中重新编译,才能运行,其原理是使用标准库编写程序,从而实现跨平台:
glibc:Linux标准C库
libstdc++:Linux标准C++库
3). Windows环境中重新编译,才能运行,其原理是统一不同系统平台的链接库,从而实现跨平台:
GTK+:基于C语言的GUI库
Qt: 基于C++的GUI库
4). Windows环境中不需要重新编译,一次编译,到处运行:
Java,使用JVM虚拟机统一不同的链接库和不同的平台,从而实现跨平台。
在Linux体系结构章节中,主要让大家对Linux结构层次有一定的了解,没有过多的长篇大论,力求简结,但其中的每一个细节要点都值得花费很多时间去研究,比如X window架构,驱动模块,文件系统的实现等。对于细节,只能靠大家自己去沉淀和深究,本博客旨在从全局概念上让大家对Linux有更多的认知,系列文章讲完后,希望留给大家的感觉是:不再害怕Linux。
在这一节里,主要和大家理一理Linux下头文件方面的杂碎,从大的方向说,Linux下编程分为两块:
1). 内核开发
2). 用户空间程序开发
1. 内核空间头文件
对于 Linux kernel的程序开发,主要使用C语言,当然汇编语言也是举足轻重,Kernel的开发主要针对哪些方面呢?
1). 硬件驱动模块
2). 内核性能的增强
3). 内核的新功能、新特性
4). 内核bug的fix
......
无论是哪一方面的内核开发,使用的都是内核自身的头文件,而内核的头文件主要有两个目录位置:
当然,除了asm和 linux 这两个主要的头文件目录,还有诸如/usr/include/drm,/usr/include/video,/usr/include/sound等驱动相关的头文件目录。
总之,如果是从事内核开发的话,所有引用的头文件均是来自内核本身,绝不可能使用用户空间的头文件,比如"glibc",“libstdc++"等头文件的引用是不可能出现在内核程序中的。
2. 用户空间头文件
用户空间的头文件杂乱纷繁,随便一个应用程序,几乎都有自己维护的头文件,但尽管如此,有一些最基本、相对底层的头文件或库函数是开发应用程序的基础。
比如,如果想在用户空间编写C语言程序,那么使用的最基本的C库和头文件是由glibc提供的;想在用户空间编写C++程序,其使用的基本库和头文件又是来自于libstdc++。
对于glibc,不仅仅提供了标准的C库,如fopen(), fclose()等, 而且还提供了和内核空间打交道的相关库,如open(), close()等。
不管是glibc提供的C库,还是由libstdc++提供的C++库,想要编写GUI窗口程序,显然不太现实,于是,有了著名的基于C语言的GTK+库和基于C++语言的QT库,这些相对上层的库所做的事情就是为了方便编写GUI程序,对C和C++封装了一层。
除了上面这些编程相关的库或头文件,Linux环境中编程还有很多编程语言,比如Java,Python等。
3. 所谓跨平台
1). 跨平台一般分为:
跨硬件平台:比如Linux内核,即能在x86上运行,也能在ARM或Android上运行
跨系统平台:即能在Linux系统下运行,也能在Windows系统下运行,比如firefox
跨硬件跨系统:比如Java程序,可以在不同的体系结构,也可以在不同的系统平台运行
2). Window环境中重新编译,才能运行,其原理是使用标准库编写程序,从而实现跨平台:
glibc:Linux标准C库
libstdc++:Linux标准C++库
3). Windows环境中重新编译,才能运行,其原理是统一不同系统平台的链接库,从而实现跨平台:
GTK+:基于C语言的GUI库
Qt: 基于C++的GUI库
4). Windows环境中不需要重新编译,一次编译,到处运行:
Java,使用JVM虚拟机统一不同的链接库和不同的平台,从而实现跨平台。
相关文章推荐
- Linux源码编译(一):从头文件说起
- Linux源码编译(一):从头文件说起
- linux 驱动 编译加载 , 程序搬移到目标板,驱动源码和头文件位置
- Linux源码与编译出的目标文件汇编代码的一致性问题
- linux编译*src.rpm源码的文件
- Linux下通过源码编译安装程序(configure/make/make install的作用,然后在/etc/profile文件里修改PATH环境变量)
- Lua在 linux下源码编译问题之readline/readline.h:没有那个文件或目录解决方法
- Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件
- android源码编译报错:prebuilts/misc/linux-x86/bison/bison: 没有这个文件或目录
- linux环境下编译源码和运行程序时,include文件和lib库文件的注意事项
- LINUX下无法载入共享的库文件,特别是源码编译安装
- linux编译ko文件(不同内核源码版本)
- 编译OpenCV-2.1.0 for arm-linux-gcc4.3.2(库文件libcv.so.2.1.0编译成为了x86-64格式)
- Linux源码安装mysql 5.5.13 (cmake编译)
- ubuntu下编译linuxcnc源码需要安装的库
- linux-gcc 编译时头文件和库文件搜索路径
- 从linux主目录中的makefile文件分析编译构成。。。
- Linux源码安装的文件默认的存放路径
- 网通Linux vps下源码编译安装MySQL
- linux 2.6.3x内核源码编译和安装