Linux下C语言编程基础知识 前言:
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助
----------------------------------------------------------------------------
1.源程序的编译
在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们
以一个实例来说明如何使用gcc编译器.
假设我们有下面一个非常简单的源程序(hello.c):
int main(int argc,char **argv) {
printf(\ }
要编译这个程序,我们只要在命令行下执行:
gcc -o hello hello.c
gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出
结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译
器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.
gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道
了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而
不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序 进行调试的信息.
知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更
多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.
gcc编译器还有2个非常有用的选项(-O2 -Wall),几乎在所有用gcc编译的程序中都可以看
到这2个选项. -O2选项表示我们希望编译器在编译的时候对我们的程序进行一定程度的
优化.2表示我们优化的级别是2. 当然你也可以不使用2,而是使用1-3的中的任何一个,不
过习惯上我们都使用2的优化级别.关于优化的详细情况可以参考gcc的帮助手册.
-Wall是警告选项,表示我们希望gcc在编译的时候,让gcc输出她认为的一些程序中可能会
出问题的一些警告信息,比如指针没有初始化就进行赋值等等一些警告信息.
2.Makefile的编写
假设我们有下面这样的一个程序,源代码如下:
/* main.c */
#include
int main(int argc,char **argv) {
mytool1_print(\ mytool2_print(\ }
/* mytool1.h */ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H
void mytool1_print(char *print_str); #endif
/* mytool1.c */ #include
void mytool1_print(char *print_str) {
printf(\ }
/* mytool2.h */
#ifndef _MYTOOL_2_H #define _MYTOOL_2_H
void mytool2_print(char *print_str); #endif
/* mytool2.c */ #include
void mytool2_print(char *print_str) {
printf(\ }
当然由于这个程序是很短的我们可以这样来编译
gcc -c main.c -I. gcc -c mytool1.c -I. gcc -c mytool2.c -I.
gcc -o main main.o mytool1.o mytool2.o
因为我们在程序中使用了我们自己的2个头文件,而在包含这2个头文件的时候,我们使用
的是<> 这样编译器在编译的时候会去系统默认的头文件路径找我们的2个头文件,由于我
们的2个头文件不在系统能够的缺省路径下面,所以我们自己扩展系统的缺省路径,为此我
们使用了-I.选项,表示将系统缺省的头文件路径扩展到当前路径.
这样的话我们也可以产生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 -I.
mytool1.o:mytool1.c mytool1.h gcc -c mytool1.c -I.
mytool2.o:mytool2.c mytool2.h gcc -c mytool2.c -I.
有了这个Makefile文件,不管我们什么时候修改了源程序当中的什么文件,我们只要执行
make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理 都不想去理的.