Linux开发之gcc/g++基本用法

1. 主要组成部分

1.1. 预处理器

预处理器(Preprocessor),主要完成头文件展开,宏替换,消除注释等,生成C代码文件.i。在.i文件中,我们可以看到展开后的头文件是怎么样的,可以看到替换后的宏是什么样的。

gcc -E main.c -o main.i
g++ -e main.cpp -o main.ii

1.2. 编译器

编译器(Compiler),主要是将标准C/CPP文件编译成汇编文件。在.s文件中,我们可以看到生成的汇编指令。

gcc/g++ -S main.i -o main.s

1.3. 汇编器

汇编器(Assembler),主要是将C/C++文件汇编成二进制文件(.o文件)。

gcc/g++ -c main.s -o main.o
// 可以一步到位将代码汇编成二进制文件
gcc -c main.c -o main.o
g++ -c main.cpp -o main.o

1.4. 链接器

链接器(Linker),主要是完成一些地址重定位,优化等,然后将二进制文件链接成一个执行文件。

gcc/g++ main.o -o main
// 一步到位
gcc main.c -o main
g++ main.cpp -o main

2. 相关文件

  1. .c/.C,C语言文件。
  2. .h文件。
  3. .cc/.cpp/.cxx,C++语言文件。
  4. .i,预处理之后的C语言源文件。
  5. .ii,预处理之后的C++语言源文件。
  6. .s/.S,汇编语言文件。

3. 常用指令

3.1. 查看版本号

-v/–version

3.2. 显示帮助信息

–help

3.3. 指定头文件目录

// 添加搜索头文件的路径dir
-I dir

3.4. 指定宏

// 相当于定义宏
-D _DBG
-D MAX_BLK=1024

3.5. 取消宏

// 相当于#undef MACRO
-U _DBG

3.6. 添加文件

// 相当于#include “xx.h”
-include file

3.7. 生成警告信息

-Wall

3.8. 扩展警告信息

// 更深入的警告分析,有一定静态分析的作用
-Wextra

3.9. 编译优化

编译优化有4个级别,级别越大优化效果越好,编译时也越长
-O0/-O1/-O2/-O3

3.10. 生成调试信息

// 生成调试信息供gdb使用
-g

3.11. 阻止链接共享库

// 在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效
// 链接静态和隐式链接动态库一样,可以用引指令阻止链接静态库
-static

3.12. 共享链接相关库

// 共享链接相当于所有可执行文件共享外部动态标准库,所占空间小
// 运行时需要包括外部动态库
-share

3.13. 指定库搜索路径

// 添加搜索库文件的目录dir
-Ldir

3.14. 指定链接库名

// 指定链接名为Liblibary.a的库文件
-llibrary

3.15. 指定语言标准

指定c99编译
gcc -std=c99
指定C++11编译
g++ -std=c++11

3.16. 生成位置无关代码

// 针对动态库,使用此指令生成与位置无关代码,可以达到真正共享动态库的效果,如果不使用此指令,动态库共享是通过代码拷贝来实现的
gcc -fPIC -shared -o Add.so add.c sub.c

4. 示例

  1. 默认

// 直接在当前目录生成同名的main可执行文件,不产生调试信息
gcc main.c

  1. 生成指定名字的可执行文件

// windows下
gcc main.c -o main.exe
// Linux下
gcc main.c -o main

  1. 编译多个源文件并链接成可执行文件

gcc -c add.c main.c
// gcc已经支持通配符,编译当前目录所有.c文件
gcc -c *.c
gcc add.o main.o -o main

  1. 编译链接多个源文件

gcc add.c main.c -o main

  1. 指定搜索头文件

gcc -I ./include add.c main.c -o main

  1. 生成动态库

// 生成共享系统库的动态库
gcc -shared add.c sub.c -o add.so

  1. 链接静态库

// 指定从当前目录中链接libadd.a
// -L./指定当前目录为库搜索目录
// 注意-ladd要放在最后面
gcc -o main.out main.c -L./ -ladd

  1. 隐式链接动态库

// Windows下
gcc -o m.exe add.so main.c
// Linux下隐式链接的方式和链接静态库的方式相同,链接libAdd.so
g++ -o main.out main.cpp -L./ -lAdd

  1. 综合

// 指定语言版本C99,指定预定义宏,指定警告类型,指定优化级别,指定生成调用信息,编程当前目录所有c文件,指定生成文件名
gcc -D _DBG -std=c99 -Wall -Wextra -O3 *.c -o main.out
// 运行生成文件
./main.out

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值