这篇文章介绍在LINUX下进行C语言编程所需要的基础知识。在这篇文章当中,我们将会学到以下内容: -源程式编译 -Makefile的编写 -程式库的链接 -程式的调试 -头文档和系统求助
1.源程式的编译
在Linux下面,假如要编译一个C语言源程式,我们要使用GNU的gcc编译器。 下面我们以一个实例来说明如何使用gcc编译器。 假设我们有下面一个很简单的源程式(hello.c): int main(int argc,char **argv) { printf("Hello Linux\n"); } 要编译这个程式,我们只要在命令行下执行: gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文档。执行./hello就能够看到程式的输出结果了。命令行中 gcc表示我们是用gcc来编译我们的源程式,-o 选项表示我们需要编译器给我们输出的可执行文档名为hello 而hello.c是我们的源程式文档。 gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了。 -o选项我们已知道了,表示我们需要输出的可执行文档名。 -c选项表示我们只需要编译器输出目标代码,而不必要输出可执行文档。 -g选项表示我们需要编译器在编译的时候提供我们以后对程式进行调试的信息。 知道了这三个选项,我们就能够编译我们自己所写的简单的源程式了,假如您想要知道更多的选项,能够查看gcc的帮助文档,那里有着许多对其他选项的周详说明。
2.Makefile的编写
假设我们有下面这样的一个程式,源代码如下: /* main.c */ #include "mytool1.h" #include "mytool2.h" int main(int argc,char **argv) { mytool1_print("hello"); mytool2_print("hello"); } /* mytool1.h */ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H void mytool1_print(char *print_str); #endif /* mytool1.c */ #include "mytool1.h" void mytool1_print(char *print_str) { printf("This is mytool1 print %s\n",print_str); } /* mytool2.h */ #ifndef _MYTOOL_2_H #define _MYTOOL_2_H void mytool2_print(char *print_str); #endif /* mytool2.c */ #include "mytool2.h" void mytool2_print(char *print_str) { printf("This is mytool2 print %s\n",print_str); } 当然由于这个程式是很短的我们能够这样来编译 gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o main main.o mytool1.o mytool2.o 这样的话我们也能够产生main程式,而且也不时很麻烦。但是假如我们考虑一下假如有一天我们修改了其中的一个文档(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许您会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就能够了。是的对于这个程式来说,是能够起到作用的。但是当我们把事情想的更复杂一点,假如我们的程式有几百个源程式的时候,难道也要编译器重新一个一个的去编译? 为此,聪明的程式员们想出了一个很好的工具来做这件事情,这就是make。我们只要执行以下make,就能够把上面的问题解决掉。在我们执行make之前,我们要先编写一个很重要的文档。--Makefile。对于上面的那个程式来说,可能的一个Makefile的文档是:
# 这是上面那个程式的Makefile文档 main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.o:main.c mytool1.h mytool2.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文档,但是我们什么时候修改了源程式当中的什么文档,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文档有关的文档,其他的文档她连理都不想去理的。 下面我们学习Makefile是如何编写的。 在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文档的依赖关系的说明。一般的格式是: target:components TAB rule 第一行表示的是依赖关系。第二行是规则。 比如说我们上面的那个Makefile文档的第二行 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 mytool2.h gcc -c $< mytool1.o:mytool1.c mytool1.h gcc -c $< mytool2.o:mytool2.c mytool2.h gcc -c $< 经过简化后我们的Makefile是简单了一点,但是人们有时候还想简单一点。这里我们学习一个Makefile的缺省规则 .c.o: gcc -c $< 这个规则表示任何的 .o文档都是依赖和相应的.c文档的。例如mytool.o依赖于mytool.c这样Makefile还能够变为: # 这是再一次简化后的Makefile main:main.o mytool1.o mytool2.o gcc -o $@ $^ .c.o: gcc -c $< 好了,我们的Makefile 也差不多了,假如想知道更多的关于Makefile规则能够查看相应的文档。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
|