Linux教程

Linux下gcc编译命令复习笔记

本文主要是介绍Linux下gcc编译命令复习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

GCC

  • 安装 sudo apt install gcc g++
  • 查看版本 gcc/g++ -v/--version
  • gcc常用参数选项
gcc编译选项 说明
-E 预处理指定的源文件,不进行编译
-S 编译指定的源文件,但是不进行汇编
-c 编译、汇编指定的源文件,但是不进行链接
-o [file1] [file2] / [file2] -o [file1] 将文件 file2 编译成可执行文件 file1
-I directory 指定 include 包含文件的搜索目录
-g 在编译的时候,生成调试信息,该程序可以被调试器调试
-D 在程序编译的时候,指定一个宏
-w 不生成任何警告信息
-Wall 生成所有警告信息
-On n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l 在程序编译的时候,指定使用的库
-L 指定编译的时候,搜索的库的路径。
-fPIC/fpic 生成与位置无关的代码
-shared 生成共享目标文件,通常用在建立共享库时
-std 指定C方言,如:-std=c99,gcc默认的方言是GNU C

库的制作

静态库

  • 命名规则
    • Linux下文件名为libxxx.a ,lib为固定前缀,.a为固定后缀,xxx为自定义库名。
  • 制作
    • gcc获得.o文件
    • 将.o文件打包,使用ar工具
      ar rcs libxxx.a xxx.o xxx.o
      r - 将文件插入备存文件中
      c - 建立备存文件
      s - 索引
  • 使用
    使用gcc中的-l和-L指定使用制作好的静态库。(注意头文件预编译要用-I)
    示例编译命令:
    gcc main.c -o main -I ./include -l calc -L ./lib
    注意上面使用的静态库文件名为libcalc.a

动态库

  • 命名规则
    • Linux下文件名为libxxx.so ,lib为固定前缀,.a为固定后缀,xxx为自定义库名。在Linux下位可执行文件。
  • 制作
    • gcc得到.o文件,得到和位置无关的代码
      gcc -c -fpic/-FPIC file1.c file2.c
    • gcc得到动态库
      gcc -shared file1.o file2.o -o libcalc.so
  • 使用
    如果使用和静态库文件一样的编译命令:
    gcc main.c -o main -I ./include -l calc -L ./lib
    然后执行生成的main程序时会发现报错:
    ./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
    
    这是因为系统找不到我们制作的动态库的位置,只需要将动态库加入到可以被ld-linux.so能搜索的地方即可。它先后搜索elf文件的DT_RPATH段 ——> 环境变量LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib//usr/lib目录找到库文件后将其载入内存。
    解决:
    1. 添加环境变量
      直接在命令行输入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<lib路径>
      之后可以通过echo $LD_LIBRARY_PATH查看环境变量是否修改成功,然后ldd main查看能否找到库文件位置。
      但是这种方法在关闭终端再重新打开后会失效,因为这是临时改变环境变量。
    • 用户修改.bashrc
      修改用户目录下的.bashrc文件。在该文件最后一行加入刚才添加环境变量时的命令,保存退出后通过. ~/.bashrcsource ~/.bashrc使其生效。
    • 系统修改profile
      sudo修改/etc/profile文件,在最后一行添加同样的命令后再保存退出后source。
    • 有时可能需要重新打开终端使修改文件生效。
    1. 修改/etc/ld.so.cache文件
      这个文件是二进制文件,需要通过修改/etc/ld.so.conf文件间接配置。直接在文件内添加lib地址后保存退出然后运行sudo ldconfig命令即可生效。
    2. 把库文件添加到库目录/lib/,/usr/lib下
      不推荐,避免出现文件名冲突问题。
这篇关于Linux下gcc编译命令复习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!