1:源程序的编译
gcc -o hello hello.c
gcc表示我们使用gcc来编译我们的源程序,-o选项表示我们要求编译器给我们输出的可执行文件名为hello
-o选项表示我们要求输出的可执行文件名。-c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件。-g选项表示
我们要求编译器在编译的时候提供我们以后对程序进行调试的信息。(具体情况参照gcc帮组文档)
2:Makefile的编写
eg.Makefile
#这是一个程序的Makefile文件
main: main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o main.c mytool1.h mytoo2.h
gcc -c main.c
mytool1.o: mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o: mytool2.c mytool2.h
gcc -c mytool2.c
Makefile的编写方法:
#开始的行是注释行,Makefile中最重要的描述文件的依赖关系的说明,一般的格式是:
target components
TAB rule
第一行表示的是依赖关系,第二行是规则。
main: main.o mytool1.o mytool2.o 表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o
当依赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令,就像我们的上面Makefile所说的要
执行gcc -o main main.o mytool1.o mytool2.o
注意规则一行中的TAB表示那里是一个TAB键
Makefile有三个非常有用的变量,分别是$@, $^, $< 代表的意义分别是:
$@--目标文件, $^--所有的依赖文件, $<--第一个依赖文件
如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为
#这是简化后的Makefile
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o main.c mytool1.h mytoo2.h
gcc -c $<
mytool1.o: mytool1.c mytool1.h
gcc -c $<
mytool2.o: mytool2.c mytool2.h
gcc -c $<
一个Makefile的缺省规则
..c.o:
gcc -c $<
这个规则表示所有的.o文件都是依赖于相应的.c文件的。例如mytool.o依赖于mytool.c
这样Makefile还可以变为:
#这是再一次简化后的Makefile
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o main.c mytool1.h mytoo2.h
gcc -c $<
..c.o:
gcc -c $<
3:程序库的链接
程序中包括其他头文件如<math.h>
在Linux下,为了使用数学函数,我们必须和数学库链接,为此我们要加入-lm选项。gcc -o temp temp.c -lm
这样才能正确的编译。
gcc编译器会子总去链接一些常用库,如<stdio.h>
有时候我们在编译程序的时候还要指定库德路径,这个时候我们要用的编译器的-L选项指定路径。比如说我们有一个库在
/home/lcl/mylib下,这样我们编译的时候还要加上-L/home/lcl/mylib。对于一些标准库来说,我们没有必要指出路径,只要它们在缺省
的库德路径下就可以了。系统的缺省库德路径/lib/ usr/lib /usr/local/lib在这三个路径下面的库,我们可以不指定路径。
4:程序的调试
最常用的调试软件是gdb,如果想在图形界面下调试程序,那么可以选择xxgdb。记得要在编译的时候加入-g 选型,可以查看gdb的帮组文
件。
现在IDE环境里面已经自带了调试器了。
5:头文件和系统求组
man function 系统就会输出该函数的详细解释和这个函数所在的头文件<stdio.h>
man 2 function 2表示我们用的是function这个函数是系统调用函数,
我们常用的是3表示函数是C的库函数。
(man是我们的最好助手)