静态库与动态库

摘要:
Gcc工作流程和编译原则1。预处理gcc-E 2。编译gcc-S 3。组装gcc-c 4。链接不带参数的参数gcc-I指定头文件的路径-o指定生成的文件名-D在编译过程中为代码定义宏-o优化程序,后跟0123这是优化级别-Wall在编译程序时提示警告信息,例如定义变量但不使用-g向程序中添加调试信息-c仅编译子程序-L引用指定使用的库的目录-L指定库的名称

gcc工作流程和编译原理

  1. 预处理 gcc -E
  2. 编译 gcc -S
  3. 汇编 gcc -c
  4. 链接 没参数
静态库与动态库第1张

gcc的参数

  -I 指定头文件的路径
  -o 指定生成的文件名
  -D 在编译的时候给代码定义宏
  -O 优化程序 后面跟 0 1 2 3 这是优化等级
  -Wall 在程序编译的时候提示警告信息 比如定义了变量没有使用
  -g 在程序中添加调试信息
  -c 只编译子程序
  -L 指定所用的库的目录
  -l 指定库的名字 掐头去尾

静态库的制作

  1>.命名规则

    lib + 库的名字 + .a 例如 libmytest.a

  2>.制作步骤

    1). 生成对应的.o文件 --------- .c --->.o -c
    2). 将生成的.o文件打包 ar rcs + 静态库的名字(libmytest.a)+ 生成的所有的.o

  3>.发布和使用静态库:

    1). 发布静态库
    2). 头文件
静态库与动态库第2张

  4>.静态库的优缺点:(由于库在编译的时候直接被打包到应用程序中,所以会有对应的优缺点)

    优点:
      1).发布程序的时候,不需要提供对应的库
      2).加载库的速度快
    缺点:
      1).库被打包到应用程序中,导致应用程序的体积很大
      2).库一旦发生了改变,应用程序都需要重新编译

动态库(共享库)的制作和使用:

1>.命名规则:

  1). lib + 名字 + .so

2>.制作步骤:

  1). 生成与位置无关的代码(生成与位置无关的.o) gcc -fPIC -c *.c 多个参数-fPIC
  2). 将.o打包成共享库(动态库)
静态库与动态库第3张

3>.发布和使用共享库

4>. 解决程序执行时动态库无法被加载的问题:

  1)放到系统的库目录中 --- 不允许使用
  2) 临时测试 (终端关闭后就会失效)
    环境变量: LD_LIBRAREY_PATH 将动态库的路径设置给该变量
    将设置的值,导入到系统环境变量中: export LD_LIBRARY_PATH
  3) 不常用的方法(永久设置):
    在家目录的.bashrc文件中添加一句话: export LD_LIBRATRY_PATH=动态库目录的绝对路径
    .bashrc修改完成,需要重启终端
  4)
    1. 需要找到动态连接器的配置文件 -- /etc/ld.so.conf
    2. 动态库的路径写到配置文件中(绝对路径)
    3. 更新 --- sudo ldconfig -v

5>. 动态库的优缺点

  优点
    1. 执行程序体积小
    2. 动态库如果更新了 不需要重新编译程序 (函数接口不变)
  缺点:
    1.发布程序的时候,需要将动态库提供给用户
    2.动态库没有被打包到应用程序中,所以调用起来相对较慢一些

免责声明:文章转载自《静态库与动态库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TCP协议与 UDP协议 网络的上网流程sublime text2 的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot 开发案例之整合FastDFS分布式文件系统

1、pom依赖 <!--fastdfs--> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.2...

Object-C与Swift混合开发

Object-C作为Apple的iOS App开发语言服务了很多个年头,2014年Apple推出了新的编程语言Swift。更高效更安全的口号再次吸引了一大批非iOS开发程序猿进入,小编觉得Swift代替Object-C仅仅是时间问题,在神州这片土地上,毕竟技术普及有些落后。但再有两年左右时间Swift产品链将形成。第三方支持框架逐步完好。Swift必将成...

反编译APK文件的三种方法(转)

因为学习Android编程的需要,有时我们需要对网络上发布的应用项目进行学习,可是Android项目一般是通过APK文件进行发布的,我们看不到源代码,嘿嘿,办法总会有的,而且不止一个...    ps:对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易...

c语言的几个重要知识点

目录: 1. 内存结构 2 .指针 3. 字符串处理 4. 裢表 5. 复习大纲中的一些知识点理解   1、 内存结构 这是核心中的核心,请仔细看完,充分理解,否则请不要看下一节内容。 每个程序一启动都有一个大小为4GB的内存,这个内存叫虚拟内存,是概念上的,真正能用到的,只是很小一部分,一般也就是在几百K到几百M。我们PC中内存,我们称之为物理内存,也...

shell学习(18)- split切分文件命令

Linux split命令用于将一个文件分割成数个。 该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。 语法: split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名] 参数: -&l...

Oracle EBS R12 XML数据表格的Excel脚本报表

一.概述 在EBS系统中,报表是一个非常重要的客户化开发内容,也是系统一种比较常见的数据输出形式。报表的做法有很多种,输出格式也有多种,较为常见的就是“数据文件+报表模板”的形式,例如用脚本程序输出XML数据源,RTF模板控制数据格式的方式。也有直接用PLSQL程序输出HTML格式的报表,数据和格式统一在程序中控制。 Excel是一种非常常用的办公软件,操...