Linux学习之GCC&GDB,Makefile

时间:2010-11-18作者:klpeng分类:Web服务器浏览:1270评论:0

使用GCC编译:
    >>gcc hello.c -o hello
        -o 是指定编译好的可执行文件名称
    >>gcc -c hello.c
        -c 只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码生成.o为后缀的目标文件(输出hello.o)
    >>gcc -g hello.c -o hello
        -g 产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就
    >>gcc -O optimize.c -o optimize
        -O 对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接的过程中进行优化处理,这样产生的可执行文件的额执行效率可以提高,但是编译、链接的速度就要相应的慢一些.
        -O2 比-O更优化,也更慢
administrator@ubuntu:~/workspace/c$ time ./optimize
Result is

real    0m4.030s
user    0m4.024s
sys    0m0.000s
administrator@ubuntu:~/workspace/c$ gcc -O optimize.c -o optimize
administrator@ubuntu:~/workspace/c$ time ./optimize
Result is

real    0m0.923s
user    0m0.920s
sys    0m0.000s
administrator@ubuntu:~/workspace/c$ gcc -O2 optimize.c -o optimize
administrator@ubuntu:~/workspace/c$ time ./optimize
Result is

real    0m0.920s
user    0m0.916s
sys    0m0.000s

    >>-Idirname 将dirname所指出的目录加入到程序头文件目录列表中。
        C中包含头文件两种方式:
        #include <a.h>
        #include "a.h"
        对于<>,预处理程序cpp在系统预设定的头文件目录(如/usr/include)中搜寻相应的文件,而对于“”,cpp在当前目录中搜索头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到制定的dirname目录中去寻找。
        例:在hello.c中加入#include <a.h>,编译时需要这样:   
        gcc -I/home/administrator/workspace/ hello.c -o hello
    >>-Ldirname 将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,链接程序Id在系统的预设定路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L制定的目录中找,然后再到系统预设定目录寻找。
    >>-lname 在连接时,装载名字为"libname.a"的函数库,改函数库位于系统预设的目录或者由-L选项确定的目录下.例如,-lm表示表示链接名为“libm.a"的数学函数库
    >>-static 静态链接库文件
        例:gcc -static hello.c -o hello
        库有动态和静态两种,动态通常用.so为后缀,静态用.a为后缀。
        Linux默认为动态链接.
        文件大小比较:
administrator@ubuntu:~/workspace/c$ gcc hello.c -o hello
administrator@ubuntu:~/workspace/c$ ls -l
总计 24
-rwxr-xr-x 1 administrator administrator 7091 2010-11-17 23:57 hello

administrator@ubuntu:~/workspace/c$ gcc -static hello.c -o hello
administrator@ubuntu:~/workspace/c$ ls -l
总计 620
-rwxr-xr-x 1 administrator administrator 616032 2010-11-17 23:57 hello

    >>-Wall  生成所有警告
    >>-w     不生成所有警告
    >>-DYES     定义MACRO宏,等效于在程序中使用#difine YES

GDB是GNU发布的一款功能强大的程序调试工具。主要完成下面三个方面的功能:
1、启动被调试的程序。
2、让被调试的程序在制定的位置停住
3、当程序被停住时,可以检查程序状态.

Makefile工具管理
       Linux程序员必须学会使用GNU make来构建和管理自己的软件工程。GNU的make能够使整个工程的编译,连接等规则.包括:工程中的哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。
    hello: main.o func1.o func2.o
        gcc main.o gunc1.o func2.o -o hello
    main.o:main.c
        gcc -c main.c
    func1.o:func1.c
        gcc -c func1.c
    func2.o:func2.c
        gcc -c func2.c

    Makefile 术语:
    规则:用于说明如何生成一个或多个目标文件,规则格式如下:   
        target:prerequisites
            command
        目标 依赖 命令
        main.o:main.c
            gcc -c main.c
         注:命令需要以Tab键开始.
   

    目标:
        在Maikefile中只应该有一个最终目标,其它目标都是被这个目标所连带出来的。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终目标。
   
    文件名:
        make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为两者之一时可用如下方法指定:  make -f 文件名
    hello:hello.c
        gcc hello.c -o hello
   
    administrator@ubuntu:~/workspace/c$ make -f Makefile
gcc hello.c -o hello

    Makefile中把那些没有任何依赖只有执行动作的目标称为伪目标
   
    变量:
        obj=main.o func1.o func2.o func3.o
        hello:$(obj)
            gcc $(obj) -o hello
    在makefile中,存在系统默认的自动化变量
        $^:代表所有的依赖文件
        $@:代表目标
        $<:代表一个依赖文件
        hello:main.o func1.o func2.o
            gcc main.o func1.o func2.o - hello
        ==>
        hello: main.o func1.o func2.o
            gcc $^ -o $@
    在Makefile中“#”字符后的内容被视作注释:
    @:取消回显       
        hello:hello.c
            @gcc hello.c -o hello

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢