GCC的简单使用
介绍
GCC
是GNU计划开发的编译器,以前全称GNU C Compiler
,为C语言设计,现在的全称GNU Compiler Collection
(GNU编译器套件),可以编译C、C++、Go、Objective -C 等多种语言
组件:
ccl、cclplus编译器,as汇编器,ld链接器 等
gcc 与 g++
- 编译文件的方式:
- GCC支持的语言都可以用
gcc
命令编译,自动通过文件扩展名识别,对于xxx.c,gcc以C编译方式对待,对于xxx.cpp,以C++编译方式对待 g++
命令一律按照C++方式编译文件
// gcc指定编译方式 -x
gcc -xc main.c
gcc -xc++ main.cpp
- 链接文件
g++ 自动链接C++标准库文件
gcc 需要手动链接所有文件
编译标准
常用编译标准:
c: c11, c17
c++: c++11, c++14, c++17
gcc/g++ -std=编译标准
编译一个C++文件
编译的过程:
预处理、编译、汇编、链接
- 编译单个.cpp文件
// 默认生成 a.out
g++ main.cpp
// 指定可执行文件名称
g++ main.cpp -o main.out
- 常用指令
选项 | 作用 | 输出 |
---|---|---|
-E | 预处理源文件,不进行编译 | main.i |
-S | 编译源文件,不进行汇编 | main.s |
-c | 编译、汇编源文件,不进行链接 | main.o |
-l library | 指定链接库文件 |
- -E 预处理
预处理操作
- 处理
#include
,#define
,#ifndef
,#program once
等预处理指令 (这里program once以文件位置识别是否重复文件,define定义宏的方式以名称识别是否重复包含) - 删掉注释
// -E 将预处理后的文件直接输出
g++ -E main.cpp
// 配合 -o 保存到指定文件
g++ -E main.cpp -o main.i
- -S 编译
编译程序文件,生成汇编代码.s
文件
输入为 .i
预处理后文件,则直接编译;输入为 .cpp
源文件,则先预处理再编译
g++ -S main.i
// 同样可以使用 -o
g++ -S main.i -o main.s
- -c 汇编
将文件执行到汇编阶段,转为机器指令,生成.o
目标文件(二进制文件)
与-S
相类似,-c
可以接受在汇编阶段前的文件,并推进到汇编阶段,输出(未链接)
g++ -c main.s
g++ -c main.i
g++ -c main.cpp
// 添加 -o 选项,输出到指定文件
g++ -c main.cpp -o hello.o
- -l 链接
将多个目标文件链接生成一个可执行文件
库可能为libxxx.a,前缀lib,名称xxx,文件类型.a
.a
achieve 文件
.so
share object 文件
g++ main.cpp -o main.out -l[库名称]
处理多个文件
目前有一个.hpp
文件
// toolfunc.hpp
void myfunc();
两个.cpp
文件:main.cpp toolfunc.cpp
// toolfunc.cpp
#include <iostream>
#include "toolfunc.hpp"
void myfunc()
{
std::cout << "hello func" << std::endl;
}
// main.cpp
#include <iostream>
#include "toolfunc.hpp"
using namespace std;
int main()
{
// 输出
cout << "hello world" << endl;
myfunc();
return 0;
}
- 当前有多个程序源文件,可以使用一条命令进行编译,但是此时不能使用
-o
指定输出文件名称
// 输出 main.o, toolfunc.o
g++ -c main.cpp toolfunc.cpp
// 错误
g++ -c main.cpp toolfunc.cpp -o main.out toolfunc.out
// g++: fatal error: cannot specify ‘-o’ with ‘-c’, ‘-S’ or ‘-E’ with multiple files
- 得到两个目标文件后,再链接
g++ main.o toolfunc.o -o main.out
- 结合上述,也可以如下一条完成
g++ main.cpp toolfunc.cpp -o main.out
g++ *.cpp -o main.out