vc代码如何在linux编译,linux下的C语言编程

从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来龙去脉070721143154.jpg1. 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值