环境变量
环境变量 | 含义 |
---|---|
CC | 默认编译器 |
CPPFLAGS | C/C++预处理选项 |
CFLAGS | C编译选项 |
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
去除符号信息