Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135752
  • 博文数量: 51
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 540
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-21 12:33
文章分类

全部博文(51)

文章存档

2011年(1)

2010年(5)

2009年(1)

2008年(12)

2007年(32)

我的朋友

分类:

2007-07-21 14:34:28

从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 $@ $<

Makefile假象目的
1. 象正常目的,只是目的文件不存在. 用.PHONY表明假象目的.
   .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 $<
嵌套执行make
针对一些大的工程, 不同模块或是不同功能的源文件放在不同的目录中,每个目录都有一个Makefile.

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 ../headers
Makefile函数
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 Autotools
GNU autotools
1. GNU Auto Tools是一系列辅助开发、打安装包的自动化工具.
2. GNU autotools包括:
   GNU automake 
   GNU autoconf
   GNU autoheader
   GNU libtool
   GNU autoscan

GNU 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)
 
 
 
阅读(1497) | 评论(1) | 转发(0) |
0

上一篇:putty备份session

下一篇:Bash编程笔记

给主人留下些什么吧!~~