从windows转向linux编程
VC的工作原理
- cl.exe: vc的编译程序
- link.exe: vc的连接程序
- nmake.exe: 项目维护工具
- .dsp文件: 用来指定如何将源文件组织成一项目,vc6以前为.mak文件
- .dsw文件: 将多个项目组织到一个工作区中
A simple makefile on Windows
CFLAGS = /nologo /W3 /O1
LFLAGS = /incremental:no /fixed
all: bb.exe
bb.exe: bb.obj
link $(LFLAGS) -out:bb.exe bb.obj
bb.obj: bb.cpp
cl $(CFLAGS) /c bb.c
linux下的c编程
gcc编译器
-E: 预编译
-S: 编译为汇编语言
-C: 编译为目标文件
-o: 指定输出文件
-w: 禁止所有警告信息
-W: 显示警告信息
-l: 连接库文件
-L: 在库文件搜索路径中添加目录
-I: 在头文件的搜索路径列表中添加目录
-g: 产生调试信息
-M: 自动寻找源文件包含的头文件,并生成依赖关系(包含标准库文件)
-MM: 类似-M, 但不包含标准库文件
gdb调试器
GNU 调试器,使用gdb在gcc编译时必须使用-g选项
file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
list 列出产生执行文件的源代码的一部分.
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部(step count)
run 执行当前被调试的程序
quit 终止 gdb
watch 监视一个变量的值而不管它何时被改变.
break 设置断点.(break if cond, break filename: fileline)
shell 使你能不离开 gdb 就执行 UNIX shell 命令.?
cont 继续运行程序
delete 删除断点
finish: 从当前函数内部退出,返回调用函数
jump address: 跳到指定的行或地址执行
disable/enable breaknum: 禁止或使能断点
Backtrace(bt): 显示堆栈帧
down: 选择并打印被当前堆栈帧调用的帧
up:选择并打印调用当前堆栈帧的帧
info break: 显示断点的信息
info locals:显示当前堆栈帧的局部变量
Print expression: 打印表达式的值
Set variable=expression: 把表达式的值赋给变量
help: 显示GDB命令的帮助
GDB调试多进程
在子进程的加入sleep, 使用ps察看子进程的pid,
然后启动另一个GDB, attach子进程的pid
GDB调试多线程
info threads: 显示当前的所有线程
thread THREADNO: 切换到某一指定的线程
GNU make
-B: 认为所有的目标都需要更新(重编译)
-C : 指定读取makefile的目录。
--debug[=]: 输出make的调试信息。它有几种不同的级别可供选:
a: 即all,输出所有的调试信息
b: 即basic,只输出简单的调试信息。即输出不需要重编译的目标
v: 即verbose,在b选项的级别之上。输出的信息包括哪个makefile被解析,
不需要被重编译的依赖文件(或是依赖目标)等。
i: 即implicit,输出所以的隐含规则。
j: 即jobs,输出执行规则中命令的详细信息,如命令的PID、返回码等。
m: 即makefile,输出make读取makefile,更新makefile,执行makefile的信息。
-d:相当于--debug=a
-e: 指明环境变量的值覆盖makefile中定义的变量的值
-f=: 指定需要执行的makefile
-i: 在执行时忽略所有的错误
-I : 指定一个被包含makefile的搜索目标
-k: 出错也不停止运行
-n: 仅输出执行过程中的命令序列,但并不执行
-p: 输出makefile中的所有数据,包括所有的规则和变量
-q: 仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,
如果是2则说明有错误发生
-r: 禁止make使用任何隐含规则
-R: 禁止make使用任何作用于变量上的隐含规则
-s: 在命令运行时不输出命令的输出
-S: 取消-k选项的作用
-t:把目标的修改日期变成最新的,即阻止生成目标的命令运行
-w: 输出运行makefile之前和之后的信息,
这个参数对于跟踪嵌套式调用make时很有用.
-W: 禁止-w
GNU makefile
make 通过makefile 完成并自动维护编译工作
1. makefile说明了如何编译各个源文件并连接生成可执行文件,并定义了
源文件之间的依赖关系
2. GNU make 工具在当前工作目录中按如下顺序搜索 makefile:
GNUmakefile
makefile
Makefile
3. 使用-f指定其他文件名作为Makefile
make -f makefile.debug
makefile 基本结构
1. 三元组(Target, Dependency, Command)
Target : Dep1 Dep2
Cmd1
Cmd2
[Blank Line]
示例:
test.o: test.cpp test.h
g++ -c -g test.cpp
2. make 根据target上一次编译的时间和目标所依赖的源文件的更新时间
而自动判断应当编译哪个源文件.
3. 如果target文件的时间戳比至少它的一个依靠文件旧的话, make就执行
相应的命令更新target文件。否则命令行不执行.
makefile预定义变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,
可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有的依赖文件,以空格分开,这些依赖文件的
修改日期比目标的创建日期晚
$@ 目标的完整名称
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
AR 归档维护程序的名称,默认值为 ar
ARFLAGS 归档维护程序的选项
AS 汇编程序的名称,默认值为 as
ASFLAGS 汇编程序的选项
CC C 编译器的名称,默认值为 cc
CFLAGS C 编译器的选项
CPP C 预编译器的名称,默认值为 $(CC) -E
CPPFLAGS C 预编译的选项
CXX C++ 编译器的名称,默认值为 g++
CXXFLAGS C++ 编译器的选项Makefile 隐含规则1. 后缀规则(Suffix Rule):
后缀规则定义了将一个具有某个后缀的文件(例如,.c 文件)
转换为具有另外一种后缀的文件(例如,.o 文件)的方法.
例如:将.c文件转化为.o文件的后缀规则为:
.c.o:
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
2. 模式规则(pattern rules):
利用模式规则定义更加复杂的依赖性规则.
例如下面的模式规则定义了如何将任意一个 X.c 文件转换为 X.o 文件:
%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $
.PHONY clean
clean:
rm -fr *.o *.tmp
2. 假如不声明clean为假象目的而且磁盘上有一文件名为clean,
因为clean不存在依赖,所以不可避免的被认为已经up-to-date,
下面的命令行永远不执行. 声明假象目的后,不去检查磁盘上的文件
从而保证下面的命令永远执行Makefile静态模式静态模式可以更加容易地定义多目标的规则
: : targets目标集
target-parrtern目标集模式
prereq-parrterns是目标的依赖模式
例如:
files = foo.elc bar.o lose.o
$(filter %.o,$(files)): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
emacs -f batch-byte-compile $
subsystem:
cd subdir && $(MAKE)(或$(MAKE) -C subdir)
SHELL和MAKEFLAGS变量都要传递到下层Makefile中引用其它的Makefile使用include关键字可以把别的Makefile包含进来
include filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
make的工作方式1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。文件搜寻make把VPATH变量作为自动查找的路径.
VPATH = src:../headers
上面的的定义指定两个目录,“src”和“../headers”,
make会按照这个顺序进行搜索(加上当前目录). 目录由":"分隔.
vpath是另外一个设置文件搜索路径的方法, 它比VPATH更灵活. 三种用法:
1、vpath 为符合模式的文件指定搜索目录。
2、vpath 清除符合模式的文件的搜索目录。
3、vpath
清除所有已被设置好了的文件搜索目录。
vapth使用方法中的需要包含“%”字符。“%”的意思是匹配零或若干字符,
例如,“%.h”表示所有以“.h”结尾的文件。指定了要搜索的文件集,
而则指定了的文件集的搜索的目录。
例如:
vpath %.h ../headersMakefile函数1. wildcard: 展开成一列所有符合由其参数描述的文件名,文件以空格分开。
例如:SOURCES=$(wildcard *.c)
2. patsubst: 匹配替换。三个参数:要匹配的式样,用什么替换,要被处理的
由空格分割的字符串。
例如:OBJS=$(patsubst %.c, %.o, $(SOURCE))
3. filter-out: 使用两个用空格分开的列表,它把第二列表中所有的存在于
第一列表中的项目删除
4. subst: 字符串替换函数, 三个参数:要替换的字符串,用什么替换,要被处理
字符串.
5. strip: 去空格函数, 去掉字串中开头和结尾的空字符.
6. findstring: 查找字符串函数. 如果找到,则返回找的字符串,否则返回空
字符串. 例如:$(findstring a, a b c)
7. ifeq: 如果两个参数相同, 把直到else(或endif)之间的代码加到makefile
中. 如果不同,则把else和endif之间的代码加入makefile.
8. ifneq: 与ifeq相反.Makefile提示1. “@”使命令的执行不显示
2. "-"忽略命令的出错,继续执行, 否则make将会退出
3. ";"使上一条的命令结果应用在下一条命令
4. export 传递变量到下级Makefile中
如果不想传递,使用unexport
5. 使用真实的“$”字符,需要用“$$”来表示
6. "="与":="的区别
(1). "="右侧的变量可以使用后面定义的值
而":="右侧的变量必须使用前面定义的值
7. $MAKELEVEL记录了当前Makefile的调用层数
8. 变量的替换: $(var:a=b), 把变量“var”中
所有以“a”字串“结尾”的“a”替换成“b”字串Makefile示例CXXFLAGS=-g -Wall -O2
CXX=g++
EXECUTABLE=calcu
SOURCES=$(wildcard *.cpp)
OBJS=$(patsubst %.cpp,%.o,$(SOURCES))
.PHONY: all clean
all: $(EXECUTABLE)
clean:
rm -f *.o
$(EXECUTABLE): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(EXECUTABLE) $(OBJS)when executing "make all" in shell with the above makefile,
$(CXX) $(CXXFLAGS) -o $(EXECUTABLE) $(OBJS)" will be executed.
And when executing **make clean,
rm -f *.o will be executed.
GNU AutotoolsGNU autotools1. GNU Auto Tools是一系列辅助开发、打安装包的自动化工具.
2. GNU autotools包括:
GNU automake
GNU autoconf
GNU autoheader
GNU libtool
GNU autoscanGNU autotools来龙去脉1. Autoconf:根据用户提供的configure.in文件,生成一个名为configure的脚本。 该脚本可以搜集有关移植性的平台相关信息,这些信息被用来生成Makefiles, 配置头文件和其它平台相关的文件。 2. Automake:根据用户提供的一个高层次的生成规则Makefile.am,生成Makefile文件的模板 Makefile.in。Automake生成的Makefiles符合GNU的Makefile标准, 用户无需再手工编写Makefile文件。 3. Libtool:使得生成内存位置无关的代码且让共享库在不同平台间移成为可能。 它可以不依赖autoconf和automake单独运行,另一方面,automake和libtool可以无缝地集成使用
autotools 产生的Makefile的常用target
1. make all: 产生我们设定的目标,始编译原代码,连结产生执行档。
2. make clean: 清除编译的执行档及目的档 (object file, *.o)。
3. make distclean: 除了清除执行档和目的档外,也把 configure
所产生的 Makefile也清除掉。
4. make install: 将程式安装至系统中. 默认安装在/usr/local/bin
5. make dist 将程序和相关的档案包装成一个压缩档。PACKAGE-VERSION.tar.gz,
根据 configure.in 档中AM_INIT_AUTOMAKE(PACKAGE, VERSION)