和我一起学习Linux编程(二)------------------工具篇

原创 2004年06月13日 16:08:00

 我不想从怎么装和使用哪个linux开始说,那对一个程序员来说没有什么意思,总有一款linux适合您,呵呵!
 我也希望能把我学linux的过程展示给你,望先知者给于指正,后进者不走弯路。
 linux/unix的系统作事风格和windows是完全不同的,linux/unix强调的是不同程序之间的协调合作,而windows强调的是简单易用强大的功能,这就造成了二者在编程工具的使用上很不一样。windows一般会使用集成式的开发环境,在一个统一的IDE下完成所有的工作,而linux会通过一系列相关的工具之间的协作来达到这一目的,所以开始在linux下编程会很不习惯,虽说现在linux下边也有集成的开发环境,但是其不一定可以在所有的linux下运行,不具有通用性,而且如果你真的想学linux先使用最传统的工具绝对是不二的法宝。下面我们来一起学习linux编程的四大法宝:gcc编译器,make工程文件,(x)emacs编辑器,gdb调试器。
 gcc
 gcc是什么就不多说了,呵呵,先来看一个例子:
 #include <iostream>
 using namespace std;
 int main()
 {
  cout<<"hello world";
  return 0;
 }
 程序不用多说了吧,用gcc编译,gcc helloword.cpp -o helloword ,-o表示要生成的文件名,下面介绍一些它的其它有用的参数,如果你想加入调试信息使用-g,打出警告信息-wall,优化-O1-O2-O3,只编译成.o文件而不链接用-c,自动查找文件依赖关系用-mm(一般是给make使用).就这么多吧,会了这些,就可以用它了,当然它还有很多其它的参数,以后用的时候再说吧
 make
 make绝对是linux下编程的重头戏,它并不能帮助你去写任何程序,而是帮助你来管理程序的编译和其它操作(如果你需要)的,基本上就是相当于windows下的集成开发环境的工程文件,呵呵。很多人说它的能力比工程文件大的多,不过我是没看出来,它能实现的好象用IDE都能实现,只不过是白菜萝卜各有所好罢了。废话少话,要想在linux下编程,你就要学它,而且你对它了解越多,它对你的好处就越大。
 很多文章都是在讲make的各种参数,却没有它的实例,下面我就先从一个实例开始讲,希望能你看过之后有点收获,最左边为行号在实际中要去掉,例子:

1  #最终文件
2  EXECUTABLE := test
3 #编译器及标志
4 CC=gcc
5 CXX=g++

6 CFLAGS := -g -Wall
7 CXXFLAGS := $(CFLAGS)
8 CXXFLAGS+= -MD
9 #库和路径
10 LIBS :=-lstlport_gcc_stldebug
11 LIBPATH:=-L/usr/local/lib
12 INCLUDEPATH:=-I/usr/local/include/stlport/
13 OBJSPATH:=../Obj/test/
14 EXECUTABLEPATH:=../Execute/

15 RM := rm -f
16 #源
17 SOURCE := $(wildcard *.c) $(wildcard *.cpp)
18 OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
19 DEPS := $(patsubst %.o,%.d,$(OBJS))
20 #规则
21 .SUFFIXES: .cpp .c .o .so .a .d
22 $(OBJSPATH)%.o:%.c
23  $(CC) $(CXXFLAGS) -c $< -o $@
24 $(OBJSPATH)%.o:%.cpp
25  $(CXX) $(CXXFLAGS) -c $< -o $@
26 $(OBJSPATH)%.d:%.cpp
27  $(CXX) -MM $< >$@
28 #主体部分
29 .PHONY : all deps objs clean rebuild
30 all : $(EXECUTABLE)
31  $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) -o $(EXECUTABLEPATH)$(EXECUTABLE)
32 deps : $(addprefix $(OBJSPATH),$(DEPS))
33 objs : $(addprefix $(OBJSPATH),$(OBJS))
34 clean :
35  @$(RM) $(OBJSPATH)*.o
36  @$(RM) $(OBJSPATH)*.d
37  @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE)
38 rebuild : clean all

39 -include $(addprefix $(OBJSPATH),$(DEPS))
40 $(EXECUTABLE) : objs

以上就是全部了,呵呵,下面开始讲解, 有不对的还请多多指教:
1 以#开始的一行为注释,和c++的//符号一样;
2 在make中可以定义宏,就类似于c++中的宏,其实就是对等号左边的由右边的来替换,它有两种形式,一种是:=表是立刻进行替换,另一种是=表示不直接进行替换而是用时才进行替换,也就是说如果你在之后改变其值左值也会随着改变,而:=则以第一个次为准;宏在使用时用$(宏名)的形式,比较奇特;
4,5 以make中有些是它自身预定义的宏名字,比如CC和CXX,CC会在编译c文件时指定编译器名字,CXX则在编译c++文件时指定编译器名字,后面就会提到;
6,7,8 同样为内定的宏,CFLAG为编译c文件时指定的参数,CXXFLAG为编译c++文件时指定的编译器参数;
10-14 为几个目录的定义,以后会用到,-l,-L,-I分别为gcc编译时指定路径时的选项;
15 内定宏(我记得是),指定删除文件所用的命令形式;
17-19 定这源,目标和依赖文件的路径以备后用,在这里要说的是,make内部有很多内定的函数,为了方便我们使用,呵呵,用法是$(函数名 参数,参数...)这里用到的几个函数的意思是:wildcard所有满足后面条件的值的枚举,patsubst是将所有第三个参数中符合第一个参数形式的文件改变成第二个参数的形式,有点绕,还有很多函数,找手册吧。
21 .SUFFIXES为make中的关键字,表示不使用之后的文件扩展名的缺省规则,在make中是有一些预先定义好的缺省规则的,比如你要编译c文件,你并不需要指定其规则,make就知道怎么去处理,在这里,去掉这些规则是为了使用我们自己的自定义规则
22-27 我们自定义的规则来了,呵呵,就这几行,我花了一个星期才试明白,它的语法很简单,%为通配符,就是dir命令中的那个*,:表示前一个由后边的依赖产生的,通过什么产生的,通过下边的那个式子,23行中$(CC)表示的是c的编译器,就是我们前面定义的gcc,然后后面是一堆参数加值,反正最后就是我们要的那个式子了。这句的整个意思是说,当遇到*.o文件要处理时,找到*.c文件,注意这个*指的是相同的文件,找到之后怎么处理用下面的式子进行编译,当然你也可以编写类似的语句处理其它语言的编译,这就是make的混合编译了吧,哈哈。还有,$<和$@都是内定宏,$<表示:后边的那些,$@表示的是:前的第一个(如果有多个文件的话)。还有就是27的那个>是什么意思你可能不明白,.d文件就是由编译器自动查找文件的依赖时产生的文件,而>表示阄它输出的结果重定向到>后面的文件中,要不它可能会输出到屏亩,这并不是我们想要的结果,至于为什么要.d文件,后面会讲到,呵呵,有点吊胃口吧
29  .PHONY 也是一关键字,表示所有后面的标志都要强制生成
30-38 主体部分,呵呵,我们在使用make的时候可能经常要这么用,make all这时make就会找文件中的all标志,如果有就会继续,其它几个也都一样.这里还要谈到一个make文件中的基本问题,呵呵,现在讲好象有点晚了,是就在make文件中有一个固定的规则匹配方式,就是:前的表示目标,:后的表示目标依赖的文件,而下面的那个就表示满足依赖后进行的处理,就是说当make找到all时就会去找all的:后面的依赖,如果所有依赖都完成或没有变化,就去执行下面的那个处理程序,就这么简单,而所有的一切都是为了达到这个目的..PHONY是说不管依赖有没有发生变化都要进行强制的处理,对于依赖文件它会从前到后一个一个找,比如38行它会先进行clean的处理(找clean的依赖)然后再进行all的处理,而它没有本身的处理.
39 include和c的#include一样,包含所有gcc自动生成的依赖文件(26-27生成),这样就不用我们自己来找了,前面的-表示当没有找到文件时,不进行报错而继续下面的工作,addprefix表示在第二个参数的每个项前面加上第一个参数表示的前缀.
40 最后我们给我们要最后生成的文件作一个依赖,完成

好累啊,不知道你明白了吗,试试,试试就知道了,什么问题再找手册,对了最后想说的是不同的make工具能力和参数都是不一样的,下次再见,歇了

和我一起学习Linux编程(三)------------------工具篇

 这次我要说的是剩下的两个工具。 emacs这是linux下的重量级的编辑器,其实它不只是一个编辑器,你可以把它当成一个集成式开发环境来看待,这在文章的最后会提到。emacs的设计理念就是一切以编辑为...
  • lu_zi
  • lu_zi
  • 2004年06月23日 22:50
  • 1173

跟我一起玩Win32开发(4):创建菜单

也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所...
  • tcjiaan
  • tcjiaan
  • 2013年01月16日 20:11
  • 20352

leveldb学习开篇

打算研究生在读期间好好学习下leveldb的源码,期望能够从中感悟一下现代软件的开发流程和设计模式,体验一下google编程规范,不得不承认leveldb源码写得很有美感,最后最重要的当然是希望从中进...
  • tmshasha
  • tmshasha
  • 2015年06月16日 22:06
  • 757

鸟哥的Linux私房菜 基础学习篇(第三版)

第零章 计算器概论 1 计算机:辅助人脑的好工具 接收用户指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或存储成有用的信息。 1.1 计算器的五大单元 输入单元,CPU控制单元,CPU算...
  • niuzhihuan
  • niuzhihuan
  • 2015年08月03日 20:17
  • 1015

一起学Netty(一)之 Hello Netty

四月份花了大概一个月的时间翻译了2015年12月出版的《Netty in Action》 说实话,翻译完了,感觉只是对Netty有了一些初步的了解,对Netty的模型在脑海中也是有了初步的雏形,好记性...
  • linuu
  • linuu
  • 2016年05月07日 17:13
  • 9035

《鸟哥的linux私房菜:基础学习篇》第3版 - 核心笔记(全)

一、什么是 Linux 呢?! • Unix 与 Linux 的历史     o Multics 系统:由 Bell(贝尔实验室)、MIT(麻省理工学院)与 GE(美国通     用电器)合作开发的...
  • sinat_36184075
  • sinat_36184075
  • 2017年05月19日 23:50
  • 618

和我一起学习Linux编程(一)----------------我的Linux宣言

    Linux不适合桌面应用,不适合桌面级的开发,这是我三年前对它的第一印象,一直以来,我都把它作为一件艺术品,远观,但是最近的一件事情完全改变了我的想法:就在一个月前,我有幸进入了x软公司工作了...
  • lu_zi
  • lu_zi
  • 2004年06月16日 15:21
  • 873

我和儿子一起学编程——play code monkey

选择了codemonkey CodeMonkey是一个在线的交到孩子任何编程的游戏类产品,针对的是9岁以上的儿童教育。 在游戏中,有一只想要吃到香蕉的小猴子,孩子通过编写代码,帮助...
  • kirlay01
  • kirlay01
  • 2016年12月09日 08:45
  • 1005

Java 之JNI基础篇(一)

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交...
  • yingshukun
  • yingshukun
  • 2018年01月13日 18:51
  • 10020

学习编程道路上的书籍之Python篇

学习编程专栏连载编程学习编程道路上的入门书籍之Python篇,文章中的所有推荐的书籍均来自知乎社区大牛力荐书籍、豆瓣评分较高书籍、各语言社区比较热门书籍以及京东、亚马逊、当当热销书籍的重合书籍。...
  • Ly4wU5giY
  • Ly4wU5giY
  • 2016年10月29日 19:16
  • 53
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:和我一起学习Linux编程(二)------------------工具篇
举报原因:
原因补充:

(最多只允许输入30个字)