Linux编程学习笔记:Linux编程基础

一、GCC程序编译

    GCC是GNU推出的功能强大、性能优越的多平台编译器,gcc可以在多种硬件平台上编译出可执行程序

    能将C、C++、汇编编译链接成可执行文件

    Linux没有文件后缀,而是看属性来判断能否执行

    Linux编程学习笔记:Linux编程基础_第1张图片

    Linux编程学习笔记:Linux编程基础_第2张图片

    hello world例程

#include 
void main()
{
        printf("Hello World!\n");
}

 

[gyy@localhost gcc]gcc hello.c -o hello
[gyy@localhost gcc]./hello
Hello World!

    基本用法

        gcc [option] [filenames]

        option

            -o :output_filename确定可执行文件的名称为output_filename,如果不给出则为a.out

           -c :只编译,不连接成为可执行程序,编译器只是由输入的.c源代码生成.o为后缀的目标文件

           -g :产生调试工具(gdb)所必要的符号信息,要想进行调试就必须加

           -O : 对程序进行优化编译、链接,提高执行效率,但编译链接速度变慢

           -O2 :优化的更彻底,速度更慢

           -I :将dirname所指出的目录加入到程序头文件目录列表中(大写的i)

           -L :将direname所指出的目录加入到库文件的目录列表下,在默认状态下连接程序ld在系统的预设路径下(/usr/lib)寻找所需的头文件,这个选项告诉链接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找

           -lname:在链接时装在名字为“libname”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下,例如,-lm表示链接名为“libm.a”的数学函数库(小L)

           -static:静态链接库文件,动态链接以so,静态为o

           -Wall:生成所有警告信息

           -w :不生成任何警告信息

           -DMACRO :定义MACRO宏

    gcc头文件存放目录

        /usr/include

       Linux编程学习笔记:Linux编程基础_第3张图片

    也可以制定一个目录,gcc会在那个目录中寻找头文件

[gyy@localhost gcc]$ gcc -I /home/gyy/study/program/ hello.c -o hello

    静态链接与动态链接

        区别在于是否将库拷贝

二、GDB调试

    是GNU发布的一款功能强大的程序调试工具

    功能:

         启动被调试程序

         让被调试的程序在指定的位置停住

         当程序被停住时,可以检查程序状态(如变量值)

    很多图像化的调试器的核心都是GDB

    启动GDB

        gdb 文件名:开始进行调试

        gdb : file 文件名

    GDB命令

        l/list 列出程序

       break(b) 函数名 在函数入口打断点

       break(b) 行号  在指定行添加断点

       break(b) 文件名:行号 在指定文件的指定行添加断点

       break(b)  行号 if 条件 当条件为真时在指定行添加断点

(gdb) b 5

Breakpoint 1 at 0x400525: file tst.c, line 5.

(gdb) b 9 if i=10

Breakpoint 2 at 0x400536: file tst.c, line 9.

        info breakpoints 查看断点

(gdb) info breakpoints

Num     Type           Disp Enb Address            What

1       breakpoint     keep y   0x0000000000400525 in main at tst.c:5

2       breakpoint     keep y   0x0000000000400536 in main at tst.c:9

stop only if i=10

        delete 断点编号 删除断点

(gdb) delete 1

(gdb) delete 2

(gdb) info breakpoints

No breakpoints or watchpoints.

        run 运行程序

        next 单步运行,遇到子函数跳过

        step 单步,遇到子函数会进入函数内部

        continue 继续运行

        print 查看变量值

        finish 运行程序知直到当前函数结束

        watch 监控变量

        quit 退出

三、Makefile 工程管理

    GNU的Make能够使整个软件工程的编译、链接只需要一个命令就可以完成

    Make在执行前,需要一个命名为Makefile的文件,Makefile文件描述了整个文件的编译,链接规则。

    其中包括:工程中的那些源文件需要编译以及如何编译;需要创建哪些库文件以及如何创建这些库文件;如何最后产证我们想要的可执行文件

    Linux编程学习笔记:Linux编程基础_第4张图片

   makefile示例:

    Linux编程学习笔记:Linux编程基础_第5张图片

    在Makefile中规则的顺序是很重要的,Makefile中只应该有一个最终目标,其他目标都是被这个目标所连带出来的,第一条规则中的目标将被确立为最终目标

    make命令默认在当前目录下寻找名字为Makefile或makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:

       make -f 文件名

[gyy@localhost gcc]$ mv makefile testmakefile

[gyy@localhost gcc]$ make

make: *** No targets specified and no makefile found.  Stop.

[gyy@localhost gcc]$ make -f testmakefile

make: `hello' is up to date.

[gyy@localhost gcc]$ ./hello

Hello World!

    Makefile中把那些没有任何依赖只有执行动作的目标成为“伪目标”(phony targets

.PHONY : clean

clean:

    rm -f  hello main.o func1.o fun2.o

    更好的使用方法

    Linux编程学习笔记:Linux编程基础_第6张图片

    Makefile中存在系统默认的自动化变量

         $^:代表所有的依赖文件

        $@:代表目标
        $<:代表第一个依赖文件

        Linux编程学习笔记:Linux编程基础_第7张图片

    #字符后的为注释

    使用@取消回显

        有回显

[gyy@localhost gcc]$ make

gcc hello.c -o hello

        关闭

hello:hello.c

        @gcc hello.c -o hello

[gyy@localhost gcc]$ make

 

你可能感兴趣的:(Linux编程,Linux学习)