点击查看Evernote原文

#@author:       gr
#@date: 2014-10-15
#@email: forgerui@gmail.com

一、GCC编译程序

Windows下使用Visual Studio只需一个按钮就可以搞定,但在Linux下你会看到其间的具体过程。

  1. 编译过程

    预处理(宏展开)、编译、汇编、链接

     1.预处理,生成.i的文件[预处理器cpp]
    -E
      只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面。
      例子用法:
      gcc -E hello.c > pianoapan.txt
      gcc -E hello.c | more
      慢慢看吧,一个hello word 也要与处理成800行的代码
    2.将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]
    -S
      只激活预处理和编译,就是指把文件编译成为汇编代码。
      例子用法
      gcc -S hello.c
      他将生成.s的汇编代码,你可以用文本编辑器查看。
    3.由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
    -c
      只激活预处理,编译,和汇编,也就是他只把程序做成obj文件。
      例子用法:
      gcc -c hello.c
      他将生成.o的obj文件
    4.连接目标代码,生成可执行程序[链接器ld]
    -o
      制定目标名称,缺省的时候,gcc 编译出来的文件是a.out。
      例子用法
      gcc -o hello.exe hello.c (哦,windows用习惯了)
      gcc -o hello.asm -S hello.c
  2. 文件类型

    gcc 通过后缀识别输入文件类别:

    .c: C语言文件

    .i: 是经过预处理过的C源代码文件

    .obj: 是编译后的目标文件

    .s: 是汇编语言源代码文件

  3. 编译hello.c

     vi hello.c
    gcc hello.c -o hello
    ./hello
  4. gcc基本用法

    gcc [options] [filenames]

    options编译选项大约有100多个,好多用不到,我也没用过o_!

     gcc hello.c
    # -I选项,指定编译时的头文件
    gcc -I /usr/local/include/opencv -c hello.c
    # -L选项,指定链接时的库文件
    gcc -L /usr/local/lib/ hello.c -o hello
    # 动态链接库以.so结尾,动态去调用库,静态链接库以.a结尾,把库包含到程序,所以程序比动态大
    # -static静态链接库,程序比较大
    gcc -static hello.c -o hello

二、GDB调试程序

  1. 编译生成可执行文件

    要加上-g选项,这样表示可以调试。

     gcc -g hello.c -o hello
  2. 启动gdb

     # 命令行直接输入
    gdb hello
    # 或者先直接敲gdb,之后file
    gdb
    file hello
  3. 设置断点

     break main
  4. 运行程序

     run
  5. l(list): 列出程序代码

  6. b(break): 4种方式

     # 在函数上打断点
    b main
    # 在行号上打断点
    b 20
    # 在文件名的行号上打断点, `b 文件名:行号`
    b hello.c:20
    # 条件断点,满足条件,i=20,断点停下
    b 20 if i = 20
  7. info: 查看断点

     info b

  8. delete: 删除断点

     # delete 断点编号
    delete 2 #删除第2个断点
  9. n(next): 下一步(不进入子函数)

  10. s(step): 下一步(如果有子函数,进入子函数)

  11. c(continue): 继续直到下个断点停住

  12. p(print): 打印出当前变量值

  13. watch: 监控变量

    # watch 变量名
    watch i
  14. q(quit): 退出gdb

  15. gdb -tui: 上面是src窗口,下面是cmd窗口,如下:



    使用Ctrl+X +A可以打开或关闭上面的src窗口。

  16. gdb功能很强大,需要大家自己去探索。

三、Makefile管理

利用Makefile去管理工程文件,可以不用每次都敲编译命令。Makefile我直接把以前写的博客的内容拿过来了,分别是《makefile文件制作入门》,《 再探Makefile》。

下面是第一篇博客的内容,比较基础:

一、首先,看一下最简单的C文件

//hello.c文件
#include <stdio.h> void main()
{
printf("hello world\n");
}
为hello.c编写makefile文件,这里用gcc编译 $ vi Makefile hello:hello.c
  gcc -o hello hello.c 从中可以看出,最简单的makefile文件只需要两行,我们分别来看
第1行:hello是要生成的文件,hello.c是编译需要的源文件,中间以:分隔
第2行:是具体的编译命令 二、我们还可以用gcc先把hello.c编译成机器语言,以.o结尾,最后再将各个文件进行链接生成二进制文件
上面的makefile文件则可以写成这样: hello:hello.o
gcc -o hello hello.o
hello.o:hello.c
gcc -c hello.c
从上面的代码中可以看出,最后编译的hello是由hello.o最后生成的
先看第3,4行:第3行,hello.c先编译生成hello.o,第4行,是生成hello.o具体的命令
再看第1,2行:第1行,二进制文件hello需要hello.o,第2行,是生成hello具体的命令
是不是很easy. 三、如果有多个文件需要进行链接,只需生成.o文件,最后链接生成最终文件
如:有file1.h,file1.c, file2.h, file2.c, main.c五个文件
makefile文件如下: main:main.o file1.o file2.o
gcc -o main main.o file1.o file2.o
main.o:main.c file1.h file2.h
gcc -c main.c
file1.o:file1.h file1.c
gcc -c file1.c
file2.o:file2.h file2.c
gcc -c file2.c 从上面代码可以看出,需要先编译出file1.o,file2.o,main.o文件,最后链接生成最终的main文件,大功告成。

第二篇博客提供了一个通用的Makefile模板,大家可以拿来修改使用。

#file start

CC=g++
CFLAGS=`pkg-config --cflags opencv`
LFLAGS=`pkg-config --libs opencv`
SOURCES=main.cpp stl.cpp non-member.cpp
OBJECTS=$(SOURCES:.cpp=.o)
RUN=stlDemo all: $(RUN) depend:
$(CC) $(CFLAGS) -MM $(SOURCES) > .deps clean:
-rm -rf $(RUN) $(OBJECTS) $(RUN): $(OBJECTS)
$(CC) -o $@ $^ $(LFLAGS)
.cpp.o:
$(CC) -c $< $(CFLAGS) include .deps #file end

###Linux基础 - 3的更多相关文章

  1. Linux基础练习题(二)

    Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...

  2. 大数据每日干货第四天(linux基础之一目录结构与常用命令)

           为了和qq空间同步,也写的第四天,前面几天明天会发布,本来打算把每天学的东西记录下来,通过朋友给的建议要发的话稍微系统化下,从大数据需要的linux基础,到离线数据分析包括hadoop. ...

  3. Linux课程实践一:Linux基础实践(SSH)

    一.SSH服务 1. 安装SSH (1)查看是否已经安装过ssh服务 rpm -qa |grep ssh (2)进行安装 sudo apt-get install openssh-server Ubu ...

  4. 还是不想改报告,伊阿忆啊哟-Linux基础继续

    hi 虽然今天是最最美好的周六(前不着工作日后不着工作日),但老子还要来改报告,但额就是不想改,你拿我有啥办法啊... 争取完结Linux基础 一.Linux常用命令(三) 4.帮助命令 4.1 帮助 ...

  5. 原来今天是感恩节-Linux基础继续&MySQL和PHP

    hi 原来今天是感恩节.虽然一直没有过这个节日的习惯,但仅仅是听到感恩的消息,都能想到一幅幅画面.愿大家安好! 下午开题会议还是有所收获,悄悄的,就变向那个不喜欢自己的人了. 一.Linux基础(二) ...

  6. 买错的电影票,含着泪也得看-LAMP搭建&Linux基础

    hi 没说过,上周五室友过生请客,在龙湖里吃嗨了喝爽了,回去的路上侃侃而谈.说好的这周一起去看年内最后的大片,火星救援的,谁知道老子眼神不好,买错了电影的时间...把周六的约定提前到了今儿个下午,ma ...

  7. Linux基础3(文件权限)

    文件权限 1.普通权限 (登陆用户对文件或目录的读写执行的权限) 普通权限对管理员用户无效 文件和目录 都有4中类型的用户u 所有者 : 文件.目录的创建者g 所属组 : 文件.目录属于的用户组o 其 ...

  8. Linux课程实践一:Linux基础实践(基础操作)

    一.软件源维护 1. 基本操作 (1)查看源列表 sudo vim /etc/apt/sources.list deb:二进制软件安装包 deb-src:源码包 (2)备份软件源列表 sudo cp ...

  9. 实践一:Linux基础实践

    一.Linux基础实践 1.1 1. 掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法. 这部分内容在许多学长学姐的报告里都有很详细的讲解,我在此就不赘述 ...

  10. Linux基础精华

    Linux基础精华 (继续跟新中...) 常用命令: Linux shell 环境 让你提升命令行效 率的 Bash 快捷键 [完整版] 设置你自己的liux alias Linux的Find使用 L ...

随机推荐

  1. iOS几个效果动画-------------------(实例详讲)qq粘性效果

    这几天做了一些简单iOS的效果图,感觉苹果官方已经帮我们做了很多了,我们只是站在巨人的肩膀上编程,这些也没什么难的,最难的也就是用到了初中的三角函数,先让大家看看这几个动画吧.先列这几个把,由上而下分 ...

  2. .Net Core静态文件中间件StaticFiles的使用

    以前,当我们的网站需要显示图片的时候,直接在网站目录下新建文件夹,把图片放在这个文件夹下,然后通过文件夹的路径就可以访问到. 但是在.net core中不可以这样,要通过中间件StaticFiles配 ...

  3. cocos2d-x CCSpriteBatchNode

    转自:http://www.cnblogs.com/jiackyan/archive/2013/04/14/3019880.html 1.先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一 ...

  4. 安卓模拟器Android SDK Manager 无法获取SDK列表的解决办法

    1.打开运行Android SDK Manager ,Tool菜单,选择Options,打开设置菜单,勾选“Force https://...sources to be fetched using h ...

  5. JQuery图片滑动插件

    效果预览: (暂无) html代码: <div id="focus"> <ul> <li> <a href="#"&g ...

  6. 学习笔记之Shell脚本的输出重定向

    shell http://baike.baidu.com/link?url=qN3THt5ZJhQtwRJJkakWdz5-vZp4V9H3OmNP97XNhaoL-dqU-6rrFrYfHXmYv6 ...

  7. win7系统升家庭版级为旗舰版的方法

    在使用的便利性上,两者没有太大差别,不过有些高级功能是家庭版所没有的,所以我们很多人都希望升级为旗舰版,那么我们需要重新安装系统吗?显然没有这么麻烦,我们只需要简单的几个步骤即可.   步骤/方法   ...

  8. CTreeCtrl 控件总结

      一 基础操作  1 插入节点 1)插入根节点 //插入根节点 HTREEITEM hRoot; CString str=L"ROOT" hRoot=nTreeCtrl.Inse ...

  9. Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)

    这些术语都是指屏幕的分辨率. VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA:Half-size VGA:即:VGA的一半,分辨率为480× ...

  10. Redirect

    Redirect To use this Class, add the following to the top of the file. use Redirect; Redirect::to($pa ...