GCC

GCC

简介

gcc

编译链接

image-20190712101420215

编译选项

  • -shared :指定生成动态链接库。
  • -static :指定生成静态链接库。
  • -fPIC :生成可用于共享库的位置独立代码。所有的内部寻址均通过全局偏移表完成。要确定一个地址,需要将代码自身的内存位置作为表中一项插入。该选项产生可以在共享库中存放并从中加载的目标模块。
  • -L. :表示要连接的库所在的目录。
  • -l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a或.so来确定库的名称。
  • -Wall :生成所有警告信息。
  • -ggdb :此选项将尽可能的生成gdb的可以使用的调试信息。
  • -g :编译器在编译的时候产生调试信息。
  • -c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件)。
  • -Wl,options :把参数(options)传递给链接器ld。如果options中间有逗号,就将options分成多个选项,然后传递给链接程序。

--whole-archive/--no-whole-archive

  • --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl;

  • 默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。

    这个时候,可以启用链接参数“--whole-archive”来告诉链接器,将后面库中所有符号都链接进来

  • 参数“-no-whole-archive”则是重置,以避免后面库的所有符号被链接进来。

安装编译

  • centos7 gcc 版本升级
1
2
3
4
5
6
# 红帽提供的开发工具包devtoolset包含了不同版本的gcc,devtoolset-x对应gcc-x.
$ yum install centos-release-scl
# 安装gcc -v8
$ yum install devtoolset-8  
# 切换
$ scl enable devtoolset-8 bash

动态链接

静态链接

  • GCC在链接过程中,参数的解析是从右往左的,参数右侧的库会先于左侧的库加载;
1
2
$ gcc -c test.c -o test.o
$ ar crv test.a test1.o test2.o test3.o
  • 查看gcc include顺序
1
$ gcc -Wp,-v -E -

参考

updatedupdated2024-05-152024-05-15