赞
踩
gcc [options] [filenames]
其中,options是编译器所需要的选项参数,filenames是文件名。
C语言编译过程一般可以分为预处理、编译、汇编、链接四个步骤。
预处理阶段主要处理宏定义和include,并进行语法检查,最终生成预处理文件。
gcc 通过-E参数调用预处理程序 cpp,完成预处理工作。- o 参数用于指定输出文件。
gcc -E -o zp.i zp.c
在编译阶段,编译器将对源代码进行词法分析、语法分析、代码优化等操作,最后生成汇编代码。这是整个过程中最重要的一步,因此也常把整个过程称为编译。
通过 - S 参数可使gcc在完成编译后停止,生成后缀 . s 的汇编文件。
gcc -S -o zp.s zp.c
汇编阶段使用汇编器对汇编代码进行处理,生成机器语言代码,并保存在后缀为.o的目标文件中。当程序由多个代码文件构成时,每个文件都要先完成汇编工作,在生成.o目标文件后,才能进入下一步链接工作。目标文件属于最终程序的某一部分,只是在链接之前还不能执行。
gcc 通过 -c 参数调用 as,完成汇编工作。
gcc -c -o zp.o zp.c
链接阶段将所有的.o文件和需要的库文件链接成一个可执行文件。经过汇编的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,当其与系统提供的启动代码链接起来时文件才能正常运行。这些都是由链接器来完成的。
gcc -o zp zp.c
gcc通过链接程序ld,完成链接工作。
链接阶段结束后将生成可执行文件,通过一下方式可运行该可执行程序。
./zp
- gcc -E hello.c -o hello.i#gcc 预处理
- ls #确认预处理后生成的源代码文件hello.i
- gcc -S hello.i -o hello.s #gcc编译
- ls #确认已生成的汇编文件hello.s
- gcc -c hello.s -o hello.o #gcc编译
- ls #确认已生成的二进制文件hello.o
- gcc hello.o -o hello #gcc链接
- ls
- file hello #查看生成文件的信息
- ./hello #执行该程序
- [qiang@localhost work]$ gcc hello.c #gcc自动生成一个a.out可执行文件
- [qiang@localhost work]$ ls
- a.out hello.c
- [qiang@localhost work]$ ./a.out #执行a.out
- Hello gcc!
- [qiang@localhost work]$
- [qiang@localhost work]$ gcc hello.c -o hello
- [qiang@localhost work]$ ls
- hello hello.c
- [qiang@localhost work]$ ./hello
- Hello gcc!
1)hello.h文件
- #ifndef _HELLO_H
- #define _HELLO_H
- void hello();
- #endif
2)hello.c文件
- #include "hello.h"
- #include <stdio.h>
- void hello(){
- printf("Hello,I'm zp!\n");
- }
3)helloMain.c文件
- #include "hello.h"
- void main()
- {
- Hello();
- }
-
gcc hello.c hello.h helloMain.c -o hello #编译生成可执行文件
- #include <stdio.h>
- int main()
- {
- int i,sum=0;
- for(i=0;i<=50;i++)
- {
- sum+=i;
- }
- printf("the sum is %d",sum);
- return 0;
- }
- [qiang@localhost code]$ gcc -g testSum.c -o testSum
- [qiang@localhost code]$ ls
- testSum testSum.c
gdb testSum
gdb调试工具将gdb作为提示符,输入相应的gdb内部命令,即可进行调试。输入help命令可获取帮助信息;输入quit命令,可以退出gdb。
- [qiang@localhost code]$ gdb testSum
- GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
- Copyright (C) 2013 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law. Type "show copying"
- and "show warranty" for details.
- This GDB was configured as "x86_64-redhat-linux-gnu".
- For bug reporting instructions, please see:
- <http://www.gnu.org/software/gdb/bugs/>...
- Reading symbols from /home/qiang/code/testSum...done.
- (gdb)
1)使用 list 或 l命令查看程序的源代码。
list后面可以接行号,此时将显示当前文件以”行号“为中心的前后10行代码。
2) 输入run 命令运行此文件
3)使用break 7 命令在程序的第7行设置一个断点
4)使用run命令可查看设置断点后程序的运行情况。程序运行到断点处自动暂停
5)使用watch sum命令给sum变量设置一个监视点。使用 p sum 命令打印 sum 变量的值。
6)使用step 命令或者next 命令可以单步执行程序。单步执行数次后,使用p sum命令观察sum值的变化情况。
- (gdb) step
- 5 for(i=0;i<=50;i++)
- (gdb) next
-
- Breakpoint 1, main () at testSum.c:7
- 7 sum+=i;
- (gdb) p sum
- $2 = 0
- (gdb) next
- Hardware watchpoint 2: sum
-
- Old value = 0
- New value = 1
- main () at testSum.c:5
- 5 for(i=0;i<=50;i++)
- (gdb) p sum
- $3 = 1
- (gdb) step
-
- Breakpoint 1, main () at testSum.c:7
- 7 sum+=i;
- (gdb) p sum
- $4 = 1
- (gdb) step
- Hardware watchpoint 2: sum
-
- Old value = 1
- New value = 3
- main () at testSum.c:5
- 5 for(i=0;i<=50;i++)
- (gdb) p sum
- $5 = 3
- (gdb)
7)使用info b 命令可以查看当前所有断点和观测点的信息
使用info b n(n为断点编号)可以查看单个断点的信息
8)使用d n 命令可以删除指定编号的断点,使用 d 命令可以删除所有断点。删除后再次使用info b命令查看断点的信息。
当源文件数量较多且具有复杂依赖时,就需要使用make工具来帮助我们进行管理。
在Linux操作系统环境下使用GNU的make工具能够比较方便地构建一个属于自己的工程,整个工程的编译只需要一个命令就可以完成编译链接。
在执行make命令时,需要提供Makefile 文件,make命令基于Makefile 文件,实现了一种自动化的编译机制。make命令通过解释Makefile 文件中的规则来编译所需要的文件和链接目标文件,进而实现自动维护编译工作。
1)如果该工程还没有被编译过,那么所有C文件都要编译并被链接。
2)如果对该工程的某些C文件进行了修改,那么make过程将只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被更改了,那么需要编译引用了这几个头文件的C文件,并链接目标程序。
Cpp学习笔记 ——4.make与Makefile - 知乎 (zhihu.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。