gcc工具

1. gcc工作流程

1.1 预处理--E

  • 宏替换
  • 头文件展开
  • 注释去掉
  • xxx.c-->xxx.i(c文件)

1.2 编译--S

  • xxx.i-->xxx.s(汇编文件)

1.3 汇编--c

  • xxx.s-->xxx.o(二进制文件)

1.4 链接

  • -o指定生成的文件名,如:gcc hello.o -o hello,(默认文件名:a.out)
  • xxx.o-->xxx(可执行)
gcc工作流程图.png

2. gcc常用参数

  • -v/--version:查看gcc版本信息


  • -I:指定头文件的路径
    例如:gcc sum.c -I ./include/ -o sum(sum.c中包含的头文件在./include/目录下)

  • -c:将汇编文件生成二进制文件,得到一个.o文件

  • -o:指定生成的文件名字

  • -g:gdb调试的时候需要加

  • -D:在编译的时候指定一个宏

    • 使用场景:测试程序的时候用
  • -Wall:添加警告信息

  • -On:优化代码,n是优化级别:1,2,3



3. 静态库和动态库的制作和使用

1. 库是什么

  • 二进制文件
  • 将源代码->二进制格式的源代码
  • 加密

2. 库制作出来之后,如何给客户使用?

  • 头文件
  • 制作出的库

3. 静态库的制作和使用

  • 命名规则:libmycalc.a
    • lib
    • mycalc:库的名字
    • .a
  • 制作步骤:
    • 原材料:源代码.c .cpp
    • 将.c文件生成.o
      例如:gcc a.c b.c -c
    • 将.o文件打包
      例:ar rcs 静态库的名字 原材料( arc rcs libmycalc.a a.o b.o)
  • 库的使用:
    • -L:指定库的路径
    • -l:指定库的名字取得lib和.a

4. 动态库的制作和使用

  • 命名规则:libxxx.so
  • 制作步骤:
    • 原材料:源代码.c .cpp
    • 将.c文件生成.o
      例如:gcc a.c b.c -c -fpic
  • 将.o文件打包
    例:gcc -shared a.o b.o -o libxxx.so
  • 库的使用:

运行./app2失败:

运行动态库加载失败解决:

  • 对于elf格式的可执行程序,是有ld-linux.so来完成的
    它先后搜索elf文件的DT_RPATH段——环境变量LD_LIBRARY_PATH——/etc/ld.so.cache文件列表——/lib/,/usr/lib/目录找到库文件后将其载入内存

  • 如何让系统找到共享库

    • 拷贝自己制作的共享库到/lib或者/usr/lib

    • 临时设置:

      • export LD_LIBRARY_PATH=库路径(例:./lib)
      • 最好:export LD_LIBRARY_PATH=库路径(例:./lib):$LD_LIBRARY_PATH
  • 永久设置

    • 用户级别:~/.bashrc
      配置完成后:重启终端/source ~/.bashrc
    • 系统级别:/etc/profile
      配置完成后:source /etc/profile
  • /etc/ld.so.cache文件列表

    • 找到/etc/ld.so.conf
    • 把动态库的绝对路径添加到文件中
    • 执行一个命令:sudo ldconfig -v
  • 知识点扩展:

    • dlopen,dlclose,dlsym

你可能感兴趣的:(gcc工具)