Linux编程
GNU是一个充满梦想的世界,Linux是一个非常神奇的操作系统.系统应该开放,软件应该自由使用.自由的信念激发无数人的激情,为自由软件事业而奋斗.然而由于在Windows的统治下太长的时间,我们对自由软件,对Linux还非常的陌生.缺少应用软件支持,缺少用户.但这一切都无法阻挡自由软件事业的发展.让我们携起手来,为自由软件同盟而奋斗吧!
程序是程序员交流的方式.可以在Linux下编写程序,为自由软件事业出一份力,是每一个Linux用户的愿望.我写这份教程的目的也在于此.以下是我的一些假定: 1.读者熟悉C语言; 2.读者已经安装了一份Linux操作系统,并且已经正在运行;
3.本教程的所有开发环境均在字符界面完成,并且十分简单,只是一份入门教程;
让我们开始吧!
vi的使用(edit)
vi是Unix/Linux下最经典的文本编辑器之一.Linux的用户必须熟悉它.
vi filename // 打开/创建一个文件(如果文件不存在的话)
这样,就进入了vi的界面了.理解vi的关键是理解vi的两种模式:编辑模式和命令模式.一开始进入的就是命令模式.在命令模式下,可以使用一些命令,如保存,退出等.在编辑模式下,可以对文挡进行编辑,修改.
在任何时候,按ESC键,将进入命令模式.在命令模式下,按a(append),i(insert)可以进入编辑模式.一般的使用i即可.在命令模式下,按':',再在:后输入wq(write and quit),就可以存盘退出了.如果不想存盘,则在:后输入q!(强行退出).在命令模式下,直接shift+ZZ,也可以直接存盘退出,而省去了输入:的麻烦.
下面是一个完整的创建C语言代码的完整的例子.
vi hello.c
// 命令模式,按i键进入编辑模式
// 输入一个测试代码
// 按ESC进入命令模式
// 存盘的两种方式:
A: 输入:+wq
B: shift+ZZ
// 放弃存盘的方式(本次编辑修改的内容无效)
输入:+q!
gcc的使用(?)
gcc是GNU的拳头产品.世界上威力强大的C语言编译器.如果你熟悉命令行编译的话,这个工具非常适合你.在Windows下也有它的一个版本.
在介绍gcc的使用之前,让我们先回顾一下C语言的编译过程:
hello.c(编译)->hello.o(连接)->hello//linux
hello.c(编译)->hello.obj(连接)->hello.exe//windows
在前面的例子中,我门已经有了一个C语言源程序,hello.c,下面我们将它编译连接成可执行文件
gcc -o hello.c// 结果:我们得到一个以默认名称命名的可执行文件a.out
gcc hello.c -c hello.o// -c选项代表编译,结果为目标代码hello.o
gcc hello.o -o hello// -o选项代表连接,结果为可执行文件hello(无后缀名)
gcc hello.c -o hello// 常规用法,一步到位,直接得到可执行文件
Linux里,当前目录下的可执行文件和系统命令是有严格区分的.你想执行一个系统命令,如拷贝命令cp,直接输入cp回车就可以了;如果想运行当前目录下的一个可执行文件hello,则需要输入./hello,才行.这也是Linux的安全措施之一吧.
gdb的使用(debug)
gdb是Linux下一个常用的调试工具.要想使用它对程序进行调试,在编译的时候注意要加上选项 -g,
gcc -g hello.c -o hello.这样得到的可执行文件中就加入了调试信息,通常文件也会变得很大.下面是它的用法:
gdb hello// 调试hello
gdb break main// break,设置断点,此处断点设在程序的开头,main函数的入口处
gdb r// 开始运行程序,在断点处停止,本处为程序的开始
gdb s// step,开始单步调试程序了,同时会打印出此处程序的源代码
gdb print var// 打印变量的当前值,程序不会向前执行,var为变量名
gdb r或者gdb q// 错误排除,让程序直接运行结束或直接退出.(gdb r运行完也不会退出gdb,请再输入一个q)
makefile的使用(?)
makefile是用于多源代码文件项目管理的.举例说明,一个可执行文件abc由a.o,b.o,c.o连接而成;而a.o由a1.c,a2.c,a3.c编译而成,b.o由b1.c,b2.c,b3.c编译而成,c.o由c1.c,c2.c,c3.c编译而成.够复杂的.我们需要
gcc a1.c a2.c a3.c -c a.o
gcc b1.c b2.c b3.c -c b.o
gcc c1.c c2.c c3.c -c c.o
gcc a.o b.o c.o -o abc
如果仅仅一个源文件a1.c发生变化,我们必须重新编译其它没有发生变化的程序,做无用功.这里的例子仍然很小,如果是一个有数百个源代码组成的工程,简化编译过程将十分必要.makefile由此而生.
makefile由依赖关系和编译命令组成.依赖关系的写法是
目标 : 依赖的文件1,依赖的文件2,依赖的文件3...
编译命令直接写在依赖关系的下一行,注意,以一个tab退格键开头,四个空格不行
我们以上面的例子写一个makefile文件.(makefile的默认文件名就是makefile,无后缀名)
vi Makefile
abc : a.o b.o c.o
gcc a.o b.o c.o -o abc
a.o : a1.c a2.c a3.c
gcc a1.c a2.c a3.c -c a.o
b.o : b1.c b2.c b3.c
gcc b1.c b2.c b3.c -c b.o
c.o : c1.c c2.c c3.c
gcc c1.c c2.c c3.c -c c.o
执行makefile,系统就会根据源文件的最后修改时间决定,那些需要重新编译,而哪些不要.