3.gcc编译流程和库制作 C++/Linux

2.gcc 编译流程-C语言

  • gcc -E hello.c > hello.i
    • 预处理,头文件展开,宏替换
    • gcc -E 默认输出在屏幕上,
    • 使用重定向>清空文件内容写入
    • >> 在文件啊后继续添加
  • gcc -S hello.i
    • 生成汇编语言
    • 生成hello.s文件
  • gcc -c
    • 将汇编翻译成二进制文件
    • 生成hello.o文件
  • ld 链接
    • 得到a,out
  • -I ./include 指定头文件路径
  • -o 指定输出文件
    • -o hello.out
  • -D DEBUG 指定宏编译,可以用于Debug
  • -L 指定库路径
  • -g 用于gdb调试,不加此选项不能进行gdb调试
  • -Wall 显示更多得警告
  • gcc hello.cpp -lstdc++ 用gcc编译c++文件

3.制作库

  • 静态库
    • 文件命名:libxxx.a 对应windows的lib文件
    • gcc -c 生成.o文件
    • ar rcs libCalc.a *.o 生成.a文件
    • 可以用nm filename 查看文件内容
    • 发布,与头文件.h一起发布
    • 使用:gcc main.c -o main.out -I include/ -L lib/ -lCalc
      • -I 头文件目录
      • -L 库文件目录
      • -l+库名(libCalc.a 取Calc )
  • 动态库
    • 编译与位置无关的文件 生成 .o 文件 ,关键参数-fPIC
      • gcc -fPIC -c *.c -I ../include/
    • .o文件打包成.so文件,关键参数-shared
      • gcc -shared -o libCalc.so *.o
    • 将库与头文件一起发布
    • 使用:
      • 拷贝到/lib 目录下,不允许
        • ln -s srcpath /lib/libCalc.so 软连接
        • ldd filename 是:list dynamic dependencies 列出动态库依赖关系
      • 将库路径添加到环境变量LD_LIBRARY_PATH ,一般推荐
        • echo $LD_LIBRARY_PATH 查看环境变量
        • export LD_LIBRARY_PATH=/home/lcl/cmd/Calc/lib/: $LD_LIBRARY_PATH:分割不会影响之前的环境变量
      • 配置/etc/ld.so.conf 文件,增加/home/-----,再执行sudo ldconfig -v,-v是显示运行,非常常用
        • sudo vi /etc/ld.so.conf
        • 添加路径
        • sudo ldconfig -v
  • 优缺点:
静态库 动态库
优点 1. 执行快
2.发布应用时不需要发布库
1.执行体积小
2.库变更时一般不需要重新编译应用
缺点 1.执行程序体积比较大
2.库变更时需要重新编译应用
1.执行时需要加载动态库,相对慢
2.发布应用时需要同时发布动态库

你可能感兴趣的:(C/C++Linux学习记录,linux,c++,运维)