关于C文件执行的流程和动态库,静态库的概念

预处理:-E选项,将define删除,展开宏定义,处理条件编译,去除注释,添加行号和标识
g++ -E test.cpp -o test.i  
编译:进行一系列的词法分析,语法分析,语义分析和优化后产生汇编代码
g++ -S test.i -o test.s
-s小写的s表示直接生产与用strip统一效果的可执行文件
一般要经过 词法分析(产生token)-语法分析(语法树)-语义分析(带变量的语法树)-源代码优化(中间语言)-代码生成(目标代码)-目标代码优化(最终目标代码)

静态链接库:
1)将add.cpp和sub.cpp编译成.o文件 g++ -c sub.cpp
2) .o文件创建静态库 ar cr libmymath.a sub.o add.o
  库文件以lib开头r插入模块 c创建库 ar tv libxx.a显示库中包含的文件
  在程序中使用库文件 g++ -o main main.cpp -L. -lmymath生成main可执行文件
  执行main程序可得到结果

  动态链接库:(也是在动态库名前加lib <libmymath.so> ,但文件扩展名为.so)
1) g++ -fPIC -o add.o -c add.cpp
  g++ -fPIC -o sub.o -c sub.cpp
  g++ -shared -o libmymath.so add.o sub.o
  也可以直接用 
  g++ -shared -o libmymath.so add.cpp sub.cpp
  
  -fPIC表示编译为独立位置的编码,不使用此选项,生成的代码是位置相关的,载入时是通过代码复制实现的,不能达到真正的代码共享
  -Lpath 代表在path目录中搜索库文件,例如 . 代表当前目录
  -Ipath 代表在path目录中搜索头文件
  -Itest 编译器在查找动态链接库时有隐含的命名规则,即名字前加lib后加.so
  
2)g++ -o main main.cpp -L. -lmymath 执行链接
有可能报错,原因是程序先在 /usr/lib 和 lib等目录查找需要的动态库文件
查找顺序:1)编译时指定的动态库搜索路径 
       2)环境变量LD_LIBRARY_PATH指定的搜索路径echo $LD_LIBRARY_PATH查看
       3)配置文件/etc/ld.so.conf中指定的动态库搜索路径,添加自己的库文件路径,然后sudo ldconfig重新加载下 
       export LD_LIBRARY_PATH = /usr/lib:$LD_LIBRARY_PATH
       sudo ldconfig
       4)默认动态库路径 /lib
       5)默认动态库路径 /usr/lib
       

测试同名库冲突:
执行    g++ -c add.cpp
      g++ -c sub.cpp 
      ar cr libmymath.a add.o sub.o
      g++ -shared -fPIC -o libmymath.so add.cpp sub.cpp     
      g++ -o main main.cpp -L. -lmymath
      动态库文件和静态库文件同名的时候,会先在path目录查找.so然后继续搜索 .a
      
动静态库文件的各自特点:
1)动态链接有利于进程间资源共享,系统运行时可以共享,动态链接库需要把代码copy到自己的空间,没办法共享
2)使程序升级简单,使用静态库,库文件变化时要重新编译,动态只需要替换库文件就可以了
3)链接载入代码可控
4)程序执行的时候,由于静态库已经被装载,所以,相对快一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值