Bootstrap

linux(Centos7):gcc/g++基本使用方法(main.cpp文件从预编译到生成可执行文件)

一、main.cpp文件从预编译到生成可执行文件

  • 预编译:
    • g++ -E -o main.i mian.cpp
    • -E对文件main.cpp进行预处理,删除注释等,展开宏定义,处理#开头的指令,导入头文件,除了#pragma开头的编译器,
  • 编译:
    • g++ -S -o main.s mian.i
    • -S告诉编译器生成汇编后停止编译
    • main.i文件进行语法分析、词法分析、代码优化等,生成main.s汇编代码文件
  • 汇编:
    • g++ -c -o main.o main.s
    • -c 把汇编翻译二进制目标文件
    • main.s汇编代码文件翻译成一条条机器指令,并生成二进制可重定位的目标文件main.o
    • 目标文件由各种不同的段组成,包括.text,.rodata,.data,.bss,符号表
  • 连接生成可执行文件main:
    • g++ -o main mian.o
    • 直接连接main.o目标文件生成可执行文件main(main.out)
    • 一般还会有静态库参与连接,在这个阶段完成不同文件各个段的合并、符号解析(找到符号定义的地方,当前目标文件由于外部引用而未定义的符号,去其他目标文件中找)符号重定位(合并目标文件且符号解析之后,给所有符号分配虚拟地址)
  • 两种连接:
    • 静态连接:只有静态库,连接的时候就全部和目标文件合并,生成可以执行文件,执行程序的时候全部导入内存。
    • 动态连接: 分为静态库和动态库,静态库只有函数的声明(类似头文件),没有实现,实现都在动态库里面,执行的时候,需要通过合并的静态库寻找到动态库中的具体实现,动态库只需要加载一份被多个进程共享使用,相比静态连接节省内存空间。
  • 从main.cpp文件一步到位生成main的可执行文件:
    • g++ -o main main.cpp

二、一个完整的g++生成可执行文件的过程(以muduo_server.cpp)

  • 基本格式
    g++ -o server muduo_server.cpp xxx.cpp -I/user/include -L/usr/lib -lmuduo_net -lmuduo_base -lpthread -std=c++11 -g
    • 其中-o 后面接目标文件的名称
    • mudou_server.cpp xxx.cpp是要连接编译的源文件
    • -I头文件搜索路径 -L库文件搜索路径 -l库名称
    • -g带调试信息,如果不带这个是没办法通过gdb进行跟踪或者调试
    • -std=c++11,指定语言版本
    • -O,指定优化级别,可以指定0~3,即-O0~-O3
  • gcc编译cpp文件
    • 需要连接标准的c++库
    • gcc -o main.out main.cpp -lstdc++
;