C语言笔记-3-概念-gcc(GNU C Compiler)使用及常用选项

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选项

  1. -o 编译生成文件,后面必须为输出文件名,中间不得有其他选项,如:gcc -o targetFile sourceFile.c
  2. -v 打印详情,包含版本配置以及编译过程,如:gcc -v -o targetFile sourceFile.c
  3. -E 编译流程中输出预处理文件选项,生成.i文件(等价于cpp),如:gcc -E -o targetFile.i sourceFile.c
  4. -S 编译流程中输出编译文件选项,生成.a或者.s文件,如:gcc -S -o targetFile.a targetFile.i
  5. -c 编译流程中输出汇编文件选项,生成.o文件(等价于as,但as可以编译.a和.s文件,-c可以编辑.s),如:gcc -c -o targetFile.o targetFile.s
  6. -I 预处理错误:找不到文件时,可以使用该选项紧跟缺失的预处理文件所在目录,如 gcc -I./xx -o targetFile sourceFile.c
  7. -D 预处理动作前,增加#define宏,用于动态切换会Debug环境之类,如: gcc -DTEST_ENV -o targetFile sourceFile.c

三、辅助指令

  1. ldd x.out linux环境下,查看x.out的依赖库关系信息(可排查是否丢失依赖的库链接)
  2. nm main.o 查看文件的函数定义(T定义 U仅声明(外部方法))
     nm main.o
    0000000000000000 T _main
                     U _printf
    

四、创建静态库

注意:静态库方式,即便删除库文件,也不会影响程序执行
.a 静态库文件

  1. $ gcc -c t_*.c 将要加入静态库的t_add.c等文件编译为对应的t_add.o等文件
  2. ar -rc libt_math.a t_*.o 将第一步编译的t_add.o等文件打包到静态库文件libt_math.a
  3. gcc -c main.c 编译main.cmain.o
  4. 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 动态库文件

  1. gcc -c -fPIC t_*.c 将要加入动态库的源文件编译为与位置无关的目标文件t_add.o

    -fPIC 指定生成与位置无关的目标文件

  2. gcc -shared -o libt_math.so *.o 将第一步生成的目标文件打包到动态库文件中libt_math.so
  3. 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

引入动态库的执行文件,需要动态连接器才能执行。
动态链接器找 默认路径 如果默认路径下没有,可以为动态链接器指定路径。
解决方法
告知动态链接器动态库所在的路径

  1. 使用环境变量告知 LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径
  2. 链接器默认的路径是/lib或者/usr/lib

总结

本章主要为C语言的gcc(GNU C Compiler)使用及常用选项

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值