zoukankan      html  css  js  c++  java
  • Linux编程基础

    GCC编译

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

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

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

    v.C.cc.cxx为后缀的文件:C++源代码文件

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

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

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

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

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

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

     

    编译和运行这段程序

    # gcc hello.c -o hello

    # ./hello

    gcc最基本的用法是

    gcc [options] [filenames]

    options:编译器所需要的编译选项

    filenames:要编译的文件名。

    编译选项

    gcc编译器的编译选项大约有100多个,其中多数我们根本就用不到,这里只介绍其中最基本、最常用的参数。

    v-o output_filename确定可执行文件的名称output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out(演示)

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

    v-g产生调试工具(GNUgdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

    v-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

    v-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

    -Idirname:dirname所指出的目录加入到程序头文件目录列表中。

    C程序中的头文件包含两种情况

    #include <A.h>

    #include B.h”

    对于<>,预处理程序cpp在系统预设的头文件目录(/usr/include)中搜寻相应的文件;而对””,cpp在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。

    例:gcc foo.c -I /home/include -ofoo

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

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

    例:gcc foo.c -L /home/lib -lfoo-o foo

    v-Wall生成所有警告信息

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

    v-DMACRO定义MACRO宏,等效于在程序中使用#define MACROGDBGNU发布的一款功能强大的程序调试工具。

    GDB快速进阶

    1.编译生成可执行文件:

    gcc -g tst.c -o tst

    2.启动GDB

    gdb tst

    3.main函数处设置断点

    break main

    4.运行程序

    run

    5.单步运行

    next

    6.继续运行

    continue

    启动GDB

    1. gdb调试程序名

    例:gdb helloworld

    2. gdb

    file 调试程序名

    GDB命令(演示)

    vlist(l) 查看程序

    vbreak(b)函数名在某函数入口处添加断点

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

    vbreak(b)文件名:行号在指定文件的指定行添

    加断点

    vbreak(b)行号if条件当条件为真时,指定行号

    处断点生效,例b 5 if i=10,当i等于10时第5

    断点生效

    vinfo break 查看所有设置的断点

    vdelete断点编号删除断点

    vrun(r) 开始运行程序

    vnext(n) 单步运行程序(不进入子函数)

    vstep(s) 单步运行程序(进入子函数)

    vcontinue(c)继续运行程序

    vprint(p)变量名查看指定变量值

    vfinish 运行程序,直到当前函数结束

    vwatch变量名对指定变量进行监控

    vquit(q) 退出gdb

    GNU make

    Makefile(术语)

    规则:用于说明如何生成一个或多个目标文件,规则格式如下:

    targets : prerequisites

    command

    目标依赖命令

    main.o : main.c

    gcc –c main.c

    目标?依赖?命令?

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

    make–f文件名

    Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phonytargets)。

    .PHONY : clean

    clean :

    rm –f hello main.o func1.o func2.o

    .PHONY将“clean”目标声明为伪目标

    变量

    makefile中,存在系统默认自动化变量

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

    $@:代表目标

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

    例:

    hello: main.o func1.o func2.o

    gcc main.o func1.o func2.o -o hello

    =

    hello: main.o func1.o func2.o

    gcc $^ -o $@

    Makefile中“#”字符后的内容被视作注释。

    hello: hello.c

    @gcc hello.c –o hello

    @:取消回显

     

     

  • 文章声明
  • 作者:Owen
  • 出处: http://www.cnblogs.com/owenyang
  • 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该博客同步发在 HEXO-博客
查看全文
  • 相关阅读:
    省市区多级联动数据组合
    常用字符串函数
    设计模式分类
    计算机网络学习笔记(绪论第一部分)
    关于JAVA核心技术(卷一)读后的思考(继承中的类、子类和超类)
    关于JAVA核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)
    关于JAVA核心技术(卷一)读后的思考(对象与类,日历的构造)
    微型学生信息管理系统的建立
    PHP异常处理(Exception)
    使用trait中相同方法的优先级问题
  • 原文地址:https://www.cnblogs.com/owenyang/p/3579130.html
  • Copyright © 2011-2022 走看看