C语言笔记-3-概念-gcc(GNU C Compiler)使用及常用选项
文章目录
前言
自学笔记,没有历史知识铺垫(省略百度部分),C语言的gcc(GNU C Compiler/GNU Compiler Collection翻译组织)使用及常用选项
一、gcc常用指令
1.gcc -v 打印版本和Config信息
#打印gcc 版本和Config信息
gcc -v
#显示内容
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
2.gcc -o output 编译输出文件
# gcc -o 输出文件名(必须紧跟-o选项)(linux/mac可以省略.out后缀名,windows需要.exe) 输入文件名
gcc -o targetFile sourceFile.c
二、gcc选项
- -o 编译生成文件,后面必须为输出文件名,中间不得有其他选项,如:gcc -o targetFile sourceFile.c
- -v 打印详情,包含版本配置以及编译过程,如:gcc -v -o targetFile sourceFile.c
- -E 编译流程中输出预处理文件选项,生成.i文件(等价于cpp),如:gcc -E -o targetFile.i sourceFile.c
- -S 编译流程中输出编译文件选项,生成.a或者.s文件,如:gcc -S -o targetFile.a targetFile.i
- -c 编译流程中输出汇编文件选项,生成.o文件(等价于as,但as可以编译.a和.s文件,-c可以编辑.s),如:gcc -c -o targetFile.o targetFile.s
- -I 预处理错误:找不到文件时,可以使用该选项紧跟缺失的预处理文件所在目录,如 gcc -I./xx -o targetFile sourceFile.c
- -D 预处理动作前,增加#define宏,用于动态切换会Debug环境之类,如: gcc -DTEST_ENV -o targetFile sourceFile.c
三、辅助指令
ldd x.out
linux环境下,查看x.out的依赖库关系信息(可排查是否丢失依赖的库链接)nm main.o
查看文件的函数定义(T定义 U仅声明(外部方法))nm main.o 0000000000000000 T _main U _printf
四、创建静态库
注意:静态库方式,即便删除库文件,也不会影响程序执行
.a 静态库文件
$ gcc -c t_*.c
将要加入静态库的t_add.c
等文件编译为对应的t_add.o
等文件ar -rc libt_math.a t_*.o
将第一步编译的t_add.o
等文件打包到静态库文件libt_math.a
gcc -c main.c
编译main.c
为main.o
gcc main.o -I local_path/. -L local_path/. -lt_math
使用静态链接生成可执行文件-I
头文件路径
-L
库文件路径
-l
库名
nm查看结果
// U标识仅声明 T标识有具体实现
// 织入静态库前
$ nm main.o
U _addMoney
0000000000000000 T _main
U _memset
U _printf
// 织入静态库后
$ nm a.out
0000000100008010 d __dyld_private
0000000100000000 T __mh_execute_header
0000000100003f60 T _addMoney // 织入静态库内容
0000000100003f00 T _main
U _memset
U _printf
U dyld_stub_binder
执行结果
$ ./a.out
a:12
五、创建动态库
需要动态连接器载入创建的动态库,程序才能执行
.so 动态库文件
gcc -c -fPIC t_*.c
将要加入动态库的源文件编译为与位置无关的目标文件t_add.o
-fPIC
指定生成与位置无关的目标文件gcc -shared -o libt_math.so *.o
将第一步生成的目标文件打包到动态库文件中libt_math.so
gcc main.c -Ilocal_path/. -Llocal_path/. -lt_math
使用动态库链接生成可执行文件-L
路径 告诉静态链接器到指定的路径下找库文件
-l
库名 指定库的名字
-fPIC
生成与位置无关的目标文件
-shared
生成共享库
-I路径
将这个路径添加到系统指定的路径 找头文件的时候
nm查看结果
$ nm a.out
0000000100008018 d __dyld_private
0000000100000000 T __mh_execute_header
U _addMoney // 织入动态库后,仍然是声明状态
0000000100003f10 T _main
U _memset
U _printf
U dyld_stub_binder
直接运行结果(报错,找不到动态库)
$ ./a.out
dyld: Library not loaded: libt_math.so
Referenced from: /Users/dony15/Desktop/c_code/c_learn_3/./a.out
Reason: image not found
Abort trap: 6
引入动态库的执行文件,需要动态连接器才能执行。
动态链接器找 默认路径 如果默认路径下没有,可以为动态链接器指定路径。
解决方法
告知动态链接器动态库所在的路径
- 使用环境变量告知 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径
- 链接器默认的路径是
/lib
或者/usr/lib
总结
本章主要为C语言的gcc(GNU C Compiler)使用及常用选项