一、整体大纲

二、共享库的制作

1. 命名规则:

lib + 名字 + .so

2. 制作步骤:

1) 生成与位置无关的代码 (生成与位置无关的.o)
    2) 将.o打包成共享库(动态库)

3. 发布和使用共享库:

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

1)放到系统的库目录 中 -- 不允许使用

2)临时测试

环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量
          将设置的值, 导入到系统环境变量中: export LD_LIBRARY_PATH
          当终端关闭, 设置会失效

3)不常用的方法(永久设置):

在家目录的 .bashrc文件 中添加一句话: export LD_LIBRARY_PATH=动态库目录的绝对路径
           .bashrc修改完成, 需要重启终端

4)修改配置文件

a. 需要找动态连接器的配置文件 --  /etc/ld.so.conf
          b. 动态库的路径写到配置文件中 -- 绝对路径
          c. 更新 -- sudo ldconfig -v

5. 优缺点:

三、动态库的制作示例  

1. 制作步骤

(1)编译与位置无关的代码(下图共享库),生成.o目标文件,关键参数 -fPIC

            进程虚拟地址空间

(2)将.o文件打包,关键参数 -shared

(3)将库与头文件一起发布

  • 生成.o目标文件

文件路径和内容同上,进入到src目录,生成.o目标文件:

[root@centos1 src]# gcc -fPIC -c *.c -I ../include/
[root@centos1 src]# ll
总用量
-rw-r--r--. root root 4月 : add.c
-rw-r--r--. root root 4月 : add.o
-rw-r--r--. root root 4月 : sub.c
-rw-r--r--. root root 4月 : sub.o
  • 将.o文件打包生成动态库
[root@centos1 src]# gcc -shared -o libCalc.so *.o
[root@centos1 src]# ll
总用量
-rw-r--r--. root root 4月 : add.c
-rw-r--r--. root root 4月 : add.o
-rwxr-xr-x. root root 4月 : libCalc.so
-rw-r--r--. root root 4月 : sub.c
-rw-r--r--. root root 4月 : sub.o

2. 使用

  • 使用生成的动态库,-L 指定动态库路径 -l 指定库名(gcc main.c -o main -I include/ -L ./lib -lCalc)

退出到calc目录下,将动态库拷贝到lib目录下并编译mian.c并执行main:

[root@centos1 calc]# gcc main.c -o main -I include/ -L ./lib -lCalc
[root@centos1 calc]# ll
总用量
drwxr-xr-x. root root 4月 : include
drwxr-xr-x. root root 4月 : lib
-rwxr-xr-x. root root 4月 : main
-rw-r--r--. root root 4月 : main.c
drwxr-xr-x. root root 4月 : src
[root@centos1 calc]# ./main
./main: error while loading shared libraries: libCalc.so: cannot open shared object file: No such file or directory

无法找到动态库目标文件,解决方法有三个:

(1)拷贝到/lib下(不允许,容易与别人库命名重合)

(2)将库路径增加到环境变量LD_LIBRARY_PATH中(不是特别推荐)

[root@centos1 calc]# export LD_LIBRARY_PATH=/home/xuejiale/src/calc/lib/:$LD_LIBRARY_PATH
[root@centos1 calc]# ./main
+ is
- is

(3)配置/etc/ld.so.conf文件,增加 /home/xuejiale/src/calc/lib/ 路径,执行 ldconfig -v,并执行main

/home/xuejiale/src/calc/lib/
[root@centos1 calc]# ./main
+ is
- is

3. 优缺点总结

缺点:

  • 执行时需要加载动态库,相对而言,比静态库慢
  • 发布应用时需要同步发布动态库

优点:

  • 执行程序体积小
  • 库变更时,一般不需要重新编译应用

动静态库总结:

静态库特点:

  • 库的代码会编译进程序里面,所以静态库编译的程序比较大。
  • 由静态库编译的程序不用依赖于系统的环境变量,所以环境变量有没有这个库文件,也可以运行。

动态库特点:

  • 库的代码不会编译进程序里面,所以动态库编译的程序比较小。
  • 由动态库编译的程序依赖于系统的环境变量有没有这个库文件,没有则运行不了。

Yuchuan_Linux_C 编程之四动态库(共享库)制作的更多相关文章

  1. 有关 GCC 及 JNA 涉及动态库/共享库时处理库文件名的问题

    动态库尤其是共享库在 Linux 环境下普遍存在库文件名包含版本号的情况,比如 Linux 环境下经常会发现一个共享库的真实文件名是 libfoo.so.1.1.0,而同时会有多个指向该真实库文件的软 ...

  2. linux 静态库和动态库(共享库)的制作与使用(注意覆盖问题)

    一.linux操作系统支持的函数库分支 静态库:libxxx.a,在编译时就将库编译进可执行程序 优点:程序的运行环境中不需要外部的函数库 缺点:可执行程序大 动态库:又称共享库,libxxx.so, ...

  3. ndk学习9: 动态使用共享库

    动态使用共享库函数 dll_main      环境介绍 续上节代码 目录结构:   android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEA ...

  4. 链接(extern、static关键词\头文件\静态库\共享库)

    原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...

  5. Linux共享库、静态库、动态库详解

    1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用.程序函数库 ...

  6. Linux静态库和共享库

    1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...

  7. gcc创建静态库和共享库

    静态库和动态(共享)库静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其 ...

  8. Linux静态库和共享库【转】

    转自:http://www.cnblogs.com/zlcxbb/p/6806269.html 1.什么是静态库 静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Wi ...

  9. 第二课 GCC入门之静态库以及共享库

    序言: 前面一课讲了gcc的简单入门,包括gcc编译步骤:预处理:编译:汇编:链接.今天这节课就来讲下linux的库也欢迎大家吐糟共同学习. 原理: linux系统中分为2种库:静态库和共享库.静态库 ...

随机推荐

  1. [原]调试实战——使用windbg调试excel启动时死锁

    原调试debugwindbg死锁deadlock 前言 这是几年前在项目中遇到的一个死锁问题,在博客园发布过.我对之前的笔记进行了整理重新发布于此. 本文假设小伙伴们知道一些基本概念,比如什么是.du ...

  2. 算法笔记 4.4 贪心 问题 A: 看电视

    问题 A: 看电视 题目描述 暑假到了,小明终于可以开心的看电视了.但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目. 现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗? 输入 输入 ...

  3. RDD(一)——概述

    什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象(其实是计算抽象).代码中是一个抽象类,它代表一个不可变.可分区. ...

  4. <USACO09DEC>视频游戏的麻烦Video Game Troublesの思路

    emm今天模拟赛的题.神奇地A了 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  5. JVM如何判断对象能否被回收

    •写在前面说起Java和C++,很容易想到让人疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM ...

  6. fscanf使用心得

    好久没碰C语言了.从现在开始,要开始刷题了. (1)int fscanf( FILE* stream, const char* format, ... ); https://www.programiz ...

  7. cs231n spring 2017 Python/Numpy基础

    本文使根据CS231n的讲义整理而成(http://cs231n.github.io/python-numpy-tutorial/),以下内容基于Python3. 1. 基本数据类型:可以用 prin ...

  8. C# 内置的类型转换方法

    C# 提供了下列内置的类型转换方法: 序号 方法 & 描述 1 ToBoolean把类型转换为布尔型. 2 ToByte把类型转换为字节类型. 3 ToChar如果可能的话,把类型转换为单个 ...

  9. Qt 信号阻塞和断开

    Qt程序中有时候不希望信号槽的触发,在某段流程结束之后,又需要继续回复信号槽状态,这时候可以用阻塞或者断开信号槽的方法来处理. 1. 阻塞方法:bool QObject::blockSignals(b ...

  10. linux上python3的安装

    我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自 ...