zoukankan      html  css  js  c++  java
  • g++编译总结

    g++编译&&gdb调试&&coredump调试

    一、编译注意细节

    1.使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错。

    2.gcc/g++ 在执行编译时,需要4步

    ①   预处理,生成.i的文件[使用-E参数]

    ②   将预处理后的文件把转换成汇编语言,生成文件.s[使用-S参数]

    ③   由汇编变为目标代码(机器代码)生成.o的文件[使用-c参数]

    ④   连接目标代码,生成可执行程序[使用-o参数]

    二、gdb调试

    1.gdb的调试命令列表.

    命令

    解释

    简写

    file

    装入想要调试的可执行文件

    list

    列出产生执行文件源代码的一部分

    l

    next

    执行一行源代码但不进入函数内部

    n

    step

    执行一行源代码而且进入函数内部

    s

    run

    执行当前被调试的程序

    r

    continue

    继续执行程序

    c

    quit

    终止GDB

    q

    print

    输出当前制定变量的值

    p

    break

    在代码里设置断点

    b

    info break

    查看设置断点的信息

    ib

    delete

    删除设置的断点

    d

    watch

    监视一个变量的值,一旦值有变化,程序停住。

    wa

    help

    GDB的帮助命令

    h

    使用方法:

    在编译程序的时候添加 –g参数,比如:

    g++ -g -o hello hello.cpp

    在gdb进行调试的使用再输入命令gdb+可执行文件名,比如:

    gdb  hello

    查看源文件 list 1,回车重复上一次指令

    之后就是根据参数列表,按照自己的需求输入自己的命令。

    参考网址:

    http://blog.csdn.net/wfdtxz/article/details/7368357

    如果要产生core文件,可以用gdb [程序名] [core文件名]进入后,输入bt查看堆栈信息。可参考:

    http://blog.csdn.net/duanbeibei/article/details/6923716

    另外,如果用makefile进行编译的话,要特别注意使用正则表达式,否则编译出的文件将不能用于调试。

    比如makefile1:(运行正常)

    executemain : main.o commonfun.o mytool.o
            g++ -o executemain main.o commonfun.o mytool.o
    main.o : main.cpp commonfun.h mytool.h
            g++ -g -c main.cpp 
    common.o : commonfun.h commonfun.cpp
            g++ -g -c commonfun.cpp
    mytool.o : mytool.h mytool.cpp
            g++ -g -c mytool.cpp
    clean : 
            rm -f executemain main.o commonfun.o mytool.o

    而makefile2:

    COMPILER=g++
    executemain : main.o commonfun.o mytool.o
            $(COMPILER) -o $@ $^
    ..c.o : 
            $(COMPILER) -g -c  $<
    clean : 
            rm -f *.o executemain

    会提示出如下的错误:

    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /*****/howtousemakefile/executemain...(no debugging symbols found)...done.

    三、g++编译选项详解:

    其他方面的知识参考如下链接:

    编译优化(-O -O2):http://www.cnblogs.com/vv1133/articles/2633669.html 指针优化

    代码覆盖(-fprofile-arcs -ftest-coverage):http://blog.chinaunix.net/uid-13182088-id-2904573.html 统计代码信息

    -lpthread: http://blog.csdn.net/wangtaoking1/article/details/9822447 线程相关

    -lrt:http://blog.csdn.net/wangxvfeng101/article/details/15336955 混合链接

     -ldl: http://www.cnblogs.com/xkfz007/archive/2012/04/26/2471771.html 静态链接和动态链接

    -luuid: http://blog.csdn.net/yasi_xi/article/details/9297565 唯一识别码

    -lm:http://blog.sina.com.cn/s/blog_7905bef10100u0kn.html  math.h函数库libm.so

    http://blog.csdn.net/starstarstone/article/details/7493144?utm_source=tuicool

    -lcrypt: 与ssl加密有关

    -Wl:告诉编译器将后面的参数传递给链接器。

    编译静态库或动态库:http://yaycici.blog.163.com/blog/static/173759063201262442532597/

    详情见附件:G++编译选项对应表。

    附件1:g++编译选项对应表:

    gcc/g++

    命令的常用选项格式(选项  解释)

    -o FILE

    指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.

    -c

    只编译生成目标文件,不链接

    -m486

    针对 486 进行代码优化。

    -O0

    不进行优化处理。

    -O 或 -O1

    优化生成代码。

    -O2

    进一步优化。

    -O3

    比 -O2 更进一步优化,包括 inline 函数。

    -w

    关闭所有警告,建议不要使用此项

    -Wall

    允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告

    -werror

    把所有警告转换为错误,以在警告发生时中止编译过程

    -MM

    输出一个make兼容的相关列表

    -v

    显示在编译过程的每一步中用到的命令

    -E

    只运行 C 预编译器。

    -shared

    生成共享目标文件。通常用在建立共享库时。

    -static

    链接静态库,即执行静态链接

    -lFOO

    链接名为libFOO的函数库

    -g

    在可执行程序中包含标准调试信息

    -ggdb

    在可执行程序中包含只有GNU debugger才能使别的达两条是信息

    -O

    优化编译过的代码

    -ON

    指定代码优化的级别为N,o<=N<=3

    -ansi

    支持ANSI/ISO C的标准语法,取消GNU的语法扩展中与该标准有冲突的部分(但这一选项并不能保证生成ANSI兼容的代码) 这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。

    -pedantic

    允许发出ANSI/ISO C标准所列出的所有警告

    -errors

    允许发出ANSI/ISO C标准所列出的所有错误

    -traditional

    支持Kernighan & Ritchie C语法(如用旧式语法定义函数);如果不知道这个选项的含义,也没有关系

    -IDIRECTORY

    指定额外的头文件搜索路径DIRECTORY。

    -LDIRECTORY

    指定额外的函数库搜索路径DIRECTORY。

    -DFOO=BAR

    在命令行定义预处理宏FOO,其值为BAR

    -IDIRNAME

    将DIRNAME加入到头文件的搜索目录列表中

    -LDIRNAME

    将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库

    -DMACRO

    以字符串“1”定义 MACRO 宏。

    -DMACRO=DEFN

    以字符串“DEFN”定义 MACRO 宏。

    -UMACRO

    取消对 MACRO 宏的定义。

  • 相关阅读:
    springboot 集成redission 以及分布式锁的使用
    springboot 使用线程池
    springboot 引入logback框架
    StringRedisTemplate 使用示例,工具类
    XHR post请求下载文件
    java List对象排序
    springboot中使用resttemplate调用服务是设置header中的accept-charset
    面试
    本地包打到项目中利用maven
    sql
  • 原文地址:https://www.cnblogs.com/bugutian/p/4626247.html
Copyright © 2011-2022 走看看