刖百:
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识?在这篇文章当中,我们将 会学到以下内容:
源程序编译
Makefile的编写
程序库的链接
程序的调试
头文件和系统求助
1 ?源程序的编译
在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器.下面我 们
以一个实例来说明如何使用gcc编译器.
假设我们有下面一个非常简单的源程序(hello.c):
int main(int argc,char * * argv)
{
printf(”Hello Linux\nH);
}
要编译这个程序,我们只要在命令行下执行:
gcc ?o hello hello.c
gcc编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出 结果了?命令行中gcc表示我们是用gcc来编译我们的源程序,?o选项表示我们婆求编译 器给我们输出的可执行文件名为hello而hello.c是我们的源程序文件.
gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道 了,表示我们要求输出的可执行文件名.-c选项表示我们只要求编译器输岀目标代码,而 不必要输出可执行文件.?g选项表示我们要求编译器在编译的时候提供我们以后对程序 进行调试的信息.
知道了这三个选项,我们就町以编译我们自己所写的简单的源程序了,如果你想要知道更 多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.
gcc编译器还有2个非常有用的选项(-02?Wall),几乎在所有用gcc编译的程序屮都可以 看
到这2个选项.选项表示我们希望编译器在编译的时候对我们的程序进行一定程度的 优化.2表示我们优化的级别是2.当然你也可以不使用2,而是使用1-3的中的任何一个, 不
过习惯上我们都使用2的优化级别.关于优化的详细情况可以参考gcc的帮助手册.
-Wall是警告选项,表示我们希望gcc在编译的时候,让gcc输出她认为的一些程序中可能会 出问题的一些警告信息,比如指针没有初始化就进行赋值等等一些警告信息.
2.Makefile 的编写
假设我们有下面这样的一个程序,源代码如下:
/* main.c */
#i nclude
#i nclude
int main(int argc,char * * argv)
{
mytooll _print(” hello”);
mytool2_print("hellon);
}
/* mytooll .h */
#ifndef _MYTOOL_1_H
define _MYTOOL_1_H
void mytool1_print(char * print_str);
endif
/* mytooll .c */
#i nclude
void mytool1_print(char * print_str)
{
printf(”This is mytooll print %s\n”,print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char * print_str);
endif
/* mytool2.c */
#i nclude
void mytool2_print(char * print_str)
{
printf(HThis is mytool2 print %s\nprint_str);
}
当然山于这个程序是很短的我们可以这样来编译
gcc ?c main.c ?l.
gcc ?c mytooll .c -I.
gcc ?c mytool2.c ?l.
gcc ?o main main.o mytooll .0 mytool2.o
因为我们在程序中使用了我们口己的2个头文件,而在包含这2个头文件的时候,我们使用 的是这样编译器在编译的时候会去系统默认的头文件路径找我们的2个头文件,由于我 们的2个头文件不在系统能够的缺省路径下面,所以我们白己扩展系统的缺省路径,为此我 们使用了?l.选项,表示将系统缺省的头文件路径扩展到当前路径.
这样的话我们也可以产生main程序,而且也不是很麻烦.但是考虑一下如果有一天我们修 改了其中的一个文件(比如说mytooll.c)那么我们难道述耍重新输入上而的命令?也许你 会说,这个很容易解决啊,我写一个SHELL脚木,让她帮我去完成不就可以了.是的对于这个 程序來说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有儿百 个源程序的时候,难道也要编译器重新一个一个的去编译?
为此,聪明的程序员们想出了一个很好的工具來做这件事情,这就是make.我们只耍执行一 下make,

706

被折叠的 条评论
为什么被折叠?



