2.g++分步编译演示从源码到执行程序的四步

2.g++分步编译演示从源码到执行程序的四步

2.1 gcc的工作流程

gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:

四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程,其中编译最耗时,因为要逐行检查语法。

gcc的工作流程:
1.预处理: cpp预处理器,去掉注释,展开头文件,宏替换
gcc -E test.c -o test.i
2.编译: gcc,将源代码文件编译成汇编语言代码
gcc -S test.i -o test.s
3.汇编: as, 将汇编语言代码编译成了二进制文件(目标代码)
gcc -c test.s -o test.o
4.链接: ld, 链接test.c代码中调用的库函数
gcc -o test test.o

一步生成最终的可执行程序:

gcc test.c -o test

2.2 gcc常用参数

▶-v 查看gcc版本号, --version也可以

▶ -E 生成预处理文件

▶ -S 生成汇编文件

-c 只编译,生成.o文件, 通常称为目标文件

-I 指定头文件所在的路径

-L 指定库文件所在的路径

-l 指定库的名字

-o 指定生成的目标文件的名字

-g 包含调试信息,使用gdb调试需要添加-g参数

▶ -On n=0∼3 编译优化,n越大优化得越多

test_gcc.cpp

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    cout << "test g++" << endl;
    return 0;
}

(1)预处理

cmt@cmt-virtual-machine:~/src/test_gcc$ vi test_gcc.cpp
cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -E test_gcc.cpp
cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -E test_gcc.cpp>test.ii //重定向方便看

(2)编译

cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -S test.ii
cmt@cmt-virtual-machine:~/src/test_gcc$ ls
test_gcc.cpp  test.ii  test.s

(3)汇编

cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -c test.s
cmt@cmt-virtual-machine:~/src/test_gcc$ ls
test_gcc.cpp  test.ii  test.o  test.s
cmt@cmt-virtual-machine:~/src/test_gcc$ ls -l
总用量 680
-rw-rw-r-- 1 cmt cmt    119 8月   7 21:30 test_gcc.cpp
-rw-rw-r-- 1 cmt cmt 681708 8月   7 21:34 test.ii
-rw-rw-r-- 1 cmt cmt   2944 8月   7 21:39 test.o
-rw-rw-r-- 1 cmt cmt   2360 8月   7 21:36 test.s
cmt@cmt-virtual-machine:~/src/test_gcc$ 

(4)链接

cmt@cmt-virtual-machine:~/src/test_gcc$ g++ test.o -o test
cmt@cmt-virtual-machine:~/src/test_gcc$ ./test
test g++
cmt@cmt-virtual-machine:~/src/test_gcc$ 

参考资料来源:夏曹俊

posted @ 2024-08-10 16:11  CodeMagicianT  阅读(32)  评论(0编辑  收藏  举报