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”编译命令标志来引用保存在下级子目录或者非标准位置的头文件,类似命令如下:
[david@localhost 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编译链接程序
查看输出结果