zoukankan      html  css  js  c++  java
  • ###Linux基础

    点击查看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
      

      gdb

    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窗口,如下:
      gdb tui
      使用Ctrl+X +A可以打开或关闭上面的src窗口。

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

    三、Makefile管理

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

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

    一、首先,看一下最简单的C文件
    
    //hello.c文件
    #include <stdio.h>
     
    void main()
    {
        printf("hello world
    ");
    }
    为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
    
  • 相关阅读:
    区分浏览器的刷新与关闭(网上查到,记录一下)
    echarts中设置markPoint
    Vue自定义指令,ref ,sync,slot
    手动封装on,emit,off
    数组的一些操作
    ES6-字符串扩展-padStart(),padEnd()
    MongoDB 数据库
    新地方
    使用echarts踩过的一些坑
    IE无法访问vue项目
  • 原文地址:https://www.cnblogs.com/gr-nick/p/4069800.html
Copyright © 2011-2022 走看看