Linux 程序设计基础知识
Linux 下 C 语言编程环境概述 Linux 下 C 语言编程常用的编辑器是 VIM 或 Emacs, 编译器一般用 gcc, 编译链接程序用 make, 跟踪调试一般使用 gdb, 项目管理用 makefile.
程序安装目录
对一个 Linux 开发人员来说, 在使用一种编程语言编写程序以前, 对操作系统中程序的保存位置有一个透彻的了解是很重要的.
Linux 下的程序通常都保存在专门的目录里. 系统软件可以在 / usr/bin 子目录里找到. 系统管理员为某个特定的主机系统或本地网络添加的程序可以在 / usr/local/bin 子目录里找到.
头文件
对 C 语言来说, 这些头文件几乎永远保存在 / usr/include 及其下级子目录里. 那些赖于所运行的 UNIX 或 Linux 操作系统特定版本的头文件一般可以在 / usr/include/sys 或 / usr/include/Linux 子目录里找到.
在调用 C 语言编译器的时候, 可以通过给出 "-I" 编译命令标志来引用保存在下级子目录或者非标准位置的头文件, 类似命令如下:
[[email protected] Linux]$ gcc -I /usr/openwin/include hello.c
库文件
库文件是一些预先编译好的函数的集合, 那些函数都是按照可再使用的原则编写的.
标准的系统库文件一般保存在 / lib 或者 / usr/lib 子目录里. 编译时要告诉 C 语言编译器 (更确切地说是链接程序) 应去查找哪些库文件. 默认情况下, 它只会查找 C 语言的标准库文件.
gcc 编译器
安装编译器: yum -y install gcc
开放, 自由和灵活是 Linux 的魅力所在, 而这一点在 gcc 上的体现就是程序员通过它能够更好地控制整个编译过程. 在使用 gcc 编译程序时, 编译过程可以细分为4个阶段:
● 预处理(Pre-Processing)
● 编译(Compiling)
● 汇编(Assembling)
● 链接(Linking)
Linux 程序员可以根据自己的需要让 gcc 在编译的任何阶段结束, 检查或使用编译器在该阶段的输出信息, 或者对最后生成的二进制文件进行控制, 以便通过加入不同数量和种类的调试代码来为今后的调试做好准备.
预处理
处理程序中所有带''#''的语句, 主要的工作: 头文件的包含和宏的定义. 把 #include 包含进来的头文件插入到 #include 所在的位置, 将 #define 定义的宏用对应的字符串替换.
编译
检查代码是否有语法错误. 如果有错, 则会报错, 若没有错, 则会把 .C 文件编译成 .S 文件.
汇编
将所有的 .S 文件转化为机器能识别的 .o 二进制文 件.
链接
将所有的 .o 文件和需要的库文件链接成一个可执行文件.
实例
创建一个名为 3.c 的文件:
要编译这个程序, 只要在命令行下执行如下命令:
这样, gcc 编译器会生成一个名为 hello 的可执行文件, 然后执行./hello 就可以看到程序的输出结果了.
命令行中 gcc 表示用 gcc 来编译源程序,-o 选项表示要求编译器输出的可执行文件名为 hello , 而 hello.c 是源程序文件. 从程序员的角度看, 只需简单地执行一条 gcc 命令就可以了;
但从编译器的角度来看, 却需要完成一系列非常繁杂的工作. 首先, gcc 需要调用预处理程序 cpp, 由它负责展开在源文件中定义的宏, 并向其中插入 #include 语句所包含的内容;
接着, gcc 会调用 ccl 和 as 将处理后的源代码编译成目标代码; 最后, gcc 会调用链接程序 ld, 把生成的目标代码链接成一个可执行程序.
为了更好地理解 gcc 的工作过程, 可以把上述编译过程分成几个步骤单独进行, 并观察每步的运行结果.
第一步要进行预编译, 使用 - E 参数可以让 gcc 在预处理结束后停止编译过程:
此时若查看 hello.i 文件中的内容, 会发现 stdio.h 的内容确实都插到文件里去了, 而且被预处理的宏定义也都作了相应的处理.
怎么来写 Makefile
Makefile 的核心是: 规则. 当执行 make 命令时, 编译器会读取当前目录下的 Makefile, 然后根据 Makefile 的规则编译. 规则:
-------------------------------------------------------------
目标: 依赖 1 依赖 2 ... 依赖 n
命令
--------------------------------------------------------------
说明: 使用命令, 依赖将生成目标 注意: 目标在首行顶格写, 而命令前有一个 TAB 键(制表符键), 不能使用空格代替.
命令执行条件:
1. "依赖" 文件 比 "目标" 文件新(指文件日期更新)
2. 没有 "目标" 这个文件 满足上述条件之一, 命令就会执行.
根据命令执行条件让命令再次执行的方法
方法 1: 用 rm 命令删除目标文件 test
方法 2: 用 touch 命令修改(即更新)a.c b.c a.h, 从而使依赖文件比目标文件新(指文件日期更新).
Linux 下 C 语言的 makefile 编写
先来编写一个最简单的 makefile(其为文件名).
首先编写 add.c 文件
再编写 sub.c 文件
最后编写 test.h 文件,
用这三个简单的文件, 我们就可以编写文件 makefile 的代码内容了.
- test: add.o sub.o
- gcc -o test add.o sub.o
- add.o: add.c test.h
- gcc -c add.c // 选项 -c 表示只是编译 (compile) 源程序, 但并没有连接 (link) 编译好的中间目标文件.
- sub.o: sub.c test.h
- gcc -c sub.c
- clean: rm -f test *.o // 编译完后, 键入 make clean 就会执行这一行语句, 即把生成程序 test 和所有扩展名为. o 的目标文件删掉.
运行 make 编译链接程序
查看输出结果
来源: http://www.bubuko.com/infodetail-3025179.html