gcc笔记

环境变量

环境变量含义
CC默认编译器
CPPFLAGSC/C++预处理选项
CFLAGSC编译选项
LDFLAGS链接器选项

配置

# 指定程序的安装路径,默认是/usr/local
./configure --prefix=<安装目录>

# 指定可执行程序的安装路径
./configure --exec-prefix=<安装目录>

# 指定程序名的前缀
./configure --program-prefix=<前缀名>

# 指定程序名的后缀
./configure --program-suffix=<后缀名>

# 交叉编译
./configure --target=arm-linux-gnu

编译

常用编译选项

选项作用
-E只预处理,生成预处理后的 .i 文件
-S只编译,生成汇编代码的 .s 文件
-c只编译,生成二进制的 .o 文件
-o链接,将目标文件和库链接到一起,生成可执行文件
-g生成调试信息
-I<头文件路径>添加头文件搜索路径
-L<动态库路径>添加动态库搜索路径
-s<静态库名>使用静态库
-l<动态库名>使用动态库
-O 或 -O1优化生成代码
-O2进一步优化代码
-O3再进一步优化代码
-O0不进行优化
-w不输出警告信息
-Wall输出所有警告信息
-x选择编译器,c、objective-c、c-header、c++、assembler
-static使用静态库,默认使用动态库
-Wl,<option>传递选项给链接器,例如,-Wl,-rpath,/usr/local/lib
-e <入口函数名>配置入口函数名

使用动态库

本篇介绍gcc的基本用法,更多动态库内容参见:Linux动态库

gcc main.c -L</path> -l<.so>

在使用gcc命令时,一般先列举源文件,然后再列举动态库。这是因为链接器是按照输入文件的顺序来处理的,因此应该先列举需要链接的源文件,再列举需要链接的库文件。如果
库文件中有未定义的符号,链接器可以在后面的库文件中查找,直到找到为止。因此,如果先列举库文件,链接器可能会找不到所需的符号,从而导致链接错误。

交叉编译

# 在linux amd64上,交叉编译linux x86程序
sudo apt install gcc-multilib
gcc -m32 main.c

# 在linux amd64上,交叉编译Windows x86程序
sudo apt install mingw-w64
i686-w64-mingw32-gcc main.c
i686-w64-mingw32-g++ main.c

# 在linux amd64上,交叉编译Windows x64程序
sudo apt install mingw-w64
x86_64-w64-mingw32-gcc main.c -o program.exe
x86_64-w64-mingw32-g++ main.c -o program.exe

# 在linux amd64上,交叉编译ARMhf程序
sudo apt install gcc-aarch64-linux-gnu gcc-aarch64-linux-gnu
aarch64-linux-gnu-gcc main.c
aarch64-linux-gnu-g++ main.c

# 在linux amd64上,交叉编译ARMhf程序
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc main.cpp
arm-linux-gnueabihf-g++ main.cpp

默认链接的动态库

在默认情况下,GCC会链接以下的库:

  • C标准库(libc):包含了C语言的常用函数和常量定义。
  • 数学库(libm):包含了常用的数学函数,例如三角函数、指数函数和对数函数等。
  • 动态链接器库(ld.so):在运行时动态链接其他的共享库,是Linux系统下的一个重要组成部分。

其余的动态库都需要手动链接。

安装

# 安装到系统目录
make install

# 安装到指定目录
make install DESTDIR=<指定目录>

工具

ldd

查看依赖的动态库。

nm

查看符号信息

objdump

查看反汇编信息。

# 以十六进制显示,并反汇编
objdump -s -d <目标文件>

# 查看段信息
objdump -h <目标文件>

objcopy

格式转换

# 将 image.jpg 转换为ELF格式
objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o

readelf

显示elf文件信息

size

查看段的大小

strings

查看文本信息

strip

去除符号信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多弗朗强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值