linux基础——GCC+Makefile

(一)GCC

GCC编译流程分为四个阶段:

预处理(Pre-Processing)::gcc–E hello.c–o hello.i

编译(Compiling):gcc–S hello.i–o hello.S

汇编(Assembling):gcc–c hello.S–o hello.o

链接(Linking):gcchello.o–o hello

GCC通过后缀来区别输入文件的类别:

.c为后缀的文件:C语言源代码文件

.a为后缀的文件:是由目标文件构成的库文件

.C,.cc或.cpp为后缀的文件:是C++源代码文件

.h为后缀的文件:头文件

.i为后缀的文件:是已经预处理过的C源代码文件

.ii为后缀的文件:是已经预处理过的C++源代码文件

.o为后缀的文件:是编译后的目标文件

.s为后缀的文件:是汇编语言源代码文件

.S为后缀的文件:是经过预编译的汇编语言源代码文件

 

3、总体选项

-c     只是编译不链接,生成目标文件“.o”

-S    只是编译不汇编,生成汇编代码-E只进行预编译,不做其他处理

-g   在可执行程序中包含标准调试信息(用于GDB调试)

-o   file指定输出文件为file

-v    打印出编译器内部编译各过程的命令行信息和编译器的版本

-static    链接静态库

-I   dir在头文件的搜索路径列表中添加dir 路径eg: gcc–I /home/student/include test.c–o test

-L  dir在库文件的搜索路径列表中添加dir 路径

-lname  链接名为libname.so的库文件eg: gcc–L /home/student/lib –lmylib   test.c–o test

 

警告和出错选项

-ansi         输出符合ANSI C标准语法的警告信息

-pedantic    允许发出ANSI C 标准所列的全部警告信息

-Wall        允许发出GCC 提供的所有有用的警告信息

-w             关闭所有警告信息

-Werror    把所有的告警信息转化为错误信息,并在警告发生时终止编译过程

****制作库文件

gcc  -shared -o libsub.a   sub.o

(二)makefile: 一般被叫做“makefile”或“Makefile”。当然你可以 在 make 的命令行指定别的文件名。如果你不特别指定,它会寻 找“makefile”或“Makefile”,因此使用这两个名字是最简单 的。

 

VPATH = src:../headers

OBJS = foo.o bar.o //定义变量

CC = gcc

CFLAGS = -Wall -O -g

myprog : $(OBJS)

              $(CC)  $(OBJS)  -o myprog    //$引用变量后,命令为gcc   foo.o bar.o  -o myprog

foo.o : foo.c foo.h bar.h

             $(CC)  $(CFLAGS)  -c  foo.c  -o  foo.o

bar.o : bar.c bar.h

             $(CC)  $(CFLAGS)  -c  bar.c  -o  bar.o

#假象目的 注释

 .PHONY :clean      

clean :

           rm  *.o

=== makefile 结束 ===

# :代表后面的东西是注释语句

变量:一般为大写,通过 = 赋值,然后通过 $ 引用该变量

         $(变量名)

变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)

FOO ?= bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,

变量值的替换。

“$(var:a=b)”或是“${var:a=b}”:把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串

三个 比较有用的变量是 $@, $< 和 $^ (这些变量不需要括号括住)。

$@ 扩展成当前规则的目的文件名,

$< 扩展成依靠列表中的第 一个依靠文件

$^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。

标 明所有的假象目的(用 .PHONY),这就告诉 make 不用检查它们 是否存在于磁碟上,也不用查找任何隐含规则,直接假设指定的目 的需要被更新。

 

格式说明:

1、

目标 : 关联文件

tab键 命令

 

2:自动推导

insert.o : defs.h buffer.h

等价于

insert.o :  insert.c defs.h buffer.h

               gcc -c  insert.o insert.c 

3:makefile中使用变量

objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

提取变量:$(objects)

特殊变量 VPATH:用于指定查找依赖文件的目录

VPATH = src:../headers

4:伪目标

.PHONY : clean      
clean :
       rm edit $(objects)

.PHONY     用于为了避免和文件重名

5:条件表达式

ifeq、else和endif

foo: $(objects)
ifeq ($(CC),gcc)
         $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

 

6、函数的调用语法

$( )    或是   ${ }

 

函数的调用语法

 

 

你可能感兴趣的:(linux,基础)