makefile以及用gcc进行C编译

C编译过程:

预处理 .c -> .i

汇编    .i -> .s

编译    .s -> .o

链接    .0 -> 可执行文件

 

gcc编译器:

gcc [选项]  [文件名]

选项包括:

 

 

假设源程序文件名为test.c。

1. 无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

2. 选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

3. 选项 -E
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。

4. 选项 -S
用法:#gcc -S test.i
作用:将预处理输出文件test.i汇编成test.s文件。

5. 选项 -c
用法:#gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。

6. 无选项链接
用法:#gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test。

7. 选项-O
用法:#gcc -O1 test.c -o test

作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

8.-Wall选项:使gcc产生尽可能多的警告信息,警告信息很有可能是错误的来源,特别是隐式编程错误,所以尽量保持0 warning。

感觉-c  -o(小写)更常用,一些关于头文件库文件目录的选项如下:

-I 选项(大写的 i):向头文件搜索目录中添加新的目录。
1、用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如
果没有找到,他回到缺省的头文件目录找。
如果使用-I制定了目录,他会先在你所制定的目录查找,然后再按常规的顺序去找.
2、用#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺
省的头文件目录查找
例如:
gcc –I /usr/dev/mysql/include test.c –o test.o

 

-L选项说明库文件所在的路径
例如:-L.(“.”表示当前路径)。
      -L/usr/lib (“/usr/lib” 为路径。注:这里的路径是绝对路径)

如果没有提供 -L选项,gcc 将在默认库文件路径下搜索

-l选项(小写的 l)说明库文件的名字。如果库文件为 libtest.so, 则选项为: -ltest

-static 强制使用静态库编译,相当于进行静态编译,生成可执行文件会大一些,但是不需要再额外添加库,往板子上移植的时候比较方便,需要注意的是自己添加库文件路径,库文件名字需要正确,会比较困扰。

 

多个文件一起编译:
文件:test_a.c  test_b.c
两种编译方法:
1、一起编译
gcc test_a.c test_b.c -o test

 

2、分别编译各个源文件,之后对编译后输出的目标文件链接
gcc -c test_a.c
gcc -c test_b.c
gcc -o test_a.o test_b.o -o test

 

比较:第一中方法编译时需要所有文件重新编译;第二种植重新编译修改的文件,未修改的不用重新编译。

Makeile

学习makefil之前要先学习上面的gcc编译器的用法,要不然makefile下面的命令看不懂很懵逼。

makefile 详细介绍教程如下:

http://www.cnblogs.com/huzz/articles/5863396.html

对我来说,需要规则


          target... : prerequisites ...

          command

          ...

          ...

         -------------------------------------------------------------------------------

需要注意的是command前面是换行tab

命令部分用的gcc编译,

学会看,使用变量表示文件

你可能感兴趣的:(linux日常使用,C++语言)