GCC的简单使用

GCC的简单使用

介绍

GCC 是GNU计划开发的编译器,以前全称GNU C Compiler,为C语言设计,现在的全称GNU Compiler Collection(GNU编译器套件),可以编译C、C++、Go、Objective -C 等多种语言

组件:
ccl、cclplus编译器,as汇编器,ld链接器 等

gcc 与 g++

  1. 编译文件的方式:
  • GCC支持的语言都可以用gcc命令编译,自动通过文件扩展名识别,对于xxx.c,gcc以C编译方式对待,对于xxx.cpp,以C++编译方式对待
  • g++命令一律按照C++方式编译文件
// gcc指定编译方式 -x
gcc -xc main.c
gcc -xc++ main.cpp
  1. 链接文件
    g++ 自动链接C++标准库文件
    gcc 需要手动链接所有文件

编译标准

常用编译标准:
c: c11, c17
c++: c++11, c++14, c++17

gcc/g++ -std=编译标准

编译一个C++文件

编译的过程:
预处理、编译、汇编、链接

  1. 编译单个.cpp文件
// 默认生成 a.out
g++ main.cpp

// 指定可执行文件名称
g++ main.cpp -o main.out
  1. 常用指令
选项作用输出
-E预处理源文件,不进行编译main.i
-S编译源文件,不进行汇编main.s
-c编译、汇编源文件,不进行链接main.o
-l library指定链接库文件
  1. -E 预处理

预处理操作

  • 处理#include, #define, #ifndef, #program once等预处理指令 (这里program once以文件位置识别是否重复文件,define定义宏的方式以名称识别是否重复包含)
  • 删掉注释
// -E 将预处理后的文件直接输出
g++ -E main.cpp

// 配合 -o 保存到指定文件
g++ -E main.cpp -o main.i
  1. -S 编译

编译程序文件,生成汇编代码.s文件
输入为 .i 预处理后文件,则直接编译;输入为 .cpp源文件,则先预处理再编译

g++ -S main.i

// 同样可以使用 -o
g++ -S main.i -o main.s
  1. -c 汇编

将文件执行到汇编阶段,转为机器指令,生成.o目标文件(二进制文件)
-S相类似,-c可以接受在汇编阶段前的文件,并推进到汇编阶段,输出(未链接)

g++ -c main.s
g++ -c main.i
g++ -c main.cpp

// 添加 -o 选项,输出到指定文件
g++ -c main.cpp -o hello.o
  1. -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;
}
  1. 当前有多个程序源文件,可以使用一条命令进行编译,但是此时不能使用-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
  1. 得到两个目标文件后,再链接
g++ main.o toolfunc.o -o main.out
  1. 结合上述,也可以如下一条完成
g++ main.cpp toolfunc.cpp -o main.out

g++ *.cpp -o main.out
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值