初识GCC

1 篇文章 0 订阅

Reference

GCC/Make/CMake关系

              cmake           make       gcc
CMakelist.txt -----> Makefile ----> Cmds ---> Binary

GCC: GNU C Compiler

编译流程

     预处理        编译        汇编        链接
 prEprocessing  assembly  compilation   linking
      -E          -S          -c          
b.c ------> b.i ------> b.s ------> b.o ------> a.out
      gcc         gcc         as          ld

编译参数

对于一个实际的C/C++项目而言,源文件一般不会只有一个,而且绝大多数情况下会使用到第三方库(Third-party Library)。 由于C/C++没有官方的包管理工具(Package Manager),如Python的pip,Java的maven,Nodejs的npm等等, 所以,在C/C++项目中使用第三方库时,一般使用系统自带的包管理器来进行第三方库的安装,例如Ubuntu下的apt-get,macOS的brew(Homebrew)等等。 同时,也可以选择自行获取第三方库的源码进行编译安装。

Third Party Library

  • head files
  • lib files
    • dynamic lib .so
    • static lib .a

gcc 命令参数

  • -I INCLUDE_DIRECTORY head files 绝对路径 e.g. -I/usr/include/
  • -l LIB_NAME e.g. math 的libm.so, -lm
  • -L LIB_DERECTORY e.g. -L/usr/lib/
  • 静态链接参数 -static 优先使用static lib,默认优先使用dyncmic lib
    e.g. 在/usr/local/opt/llvm/lib目录下,同时存在库文件libunwind.solibunwind.a。 为了让gcc在链接时使用静态链接库文件libunwind.a,我们可以添加-static参数,
  • 优化参数 -O0-O1-O2-O3
    • -O0参数表示不使用任何优化策略,是gcc默认的优化参数。
    • -O1会尽量采用一些不影响编译速度的优化策略,降低生成的二进制文件的大小,以及提高程序执行的速度。
    • -O2使用-O1中的所有优化策划,还会采用一些会降低编译速度的优化策略,以提高程序的执行速度
    • -O3-O2的基础上,使用更多的优化策略。这些额外的优化策略会进一步降低编译速度,而且会增加生成的二进制文件的大小,但程序的执行速度则会进一步提高。
    • -Os则和-O3优化的方向相反。它在-O2的基础上,采用额外的优化策略,尽量的降低生成的二进制文件的大小。
  • 宏相关参数
    • -Dmacro定义宏macro,默认将其定义为1,相当于在程序源码中使用#define macro语句。
    • -Dmacro=def定义宏macro为def,相当于在程序源码中使用#define macro=def语句。
    • -Umacro取消宏macro的定义,相当于在程序源码中使用#undef macro语句。
    • -undef取消所有非标准宏的定义
  • 其他
    • -std 使用c++标准, -std=c++11 -std=c99 -ansi一般等同于-std=c90
    • -Werror 要求gcc将产生的警告(Warning)当成错误(Error)进行显示
    • -Wall 显示出尽可能多的警告信息
    • -w 不显示警告信息
    • -wl 将后面跟随的参数传递给链接器ld
    • -v 显示gcc编译过程中一些额外输出信息。

Demo

#include <bits/stdc++.h>

using namespace std;

int main(int argc, char** argv) {
  map<int, unordered_set<int>> m;
  if (m[5].count(6)) {
    cout << "find\n";
  } else {
    cout << "not exist\n";
  }

  return 0;
}
gcc main.cc -std=c++11 -lstdc++ -L/usr/lib32/ -I/usr/include/c++/5 -o main
./main

# or
g++ main.cc -std=c++11
./main
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值