1、相关知识

(1)、不管是制作静态库还是动态库,都得对.o文件进行打包;

(2)、在/lib64目录下,静态库文件.a,动态库文件.so

2、静态库

(1)、gcc -c add.c    ------> 生成add.o文件,其中通过参数(-c);

(2)、静态库由命令ar创建;  ar  -cr  add.a  add.o

  (3)、静态库的编译有两种方法:

  a:gcc test.c -o test -L. add.a     //每次都得在编译时加上-L. 静态库文件;

b、将.a文件(此时的.a文件必须为lib开头的)放到/lib64目录下面,此时就不加-L.参数了,但是运行时要加上静态库文件(-lxxxx);

样例实现

第一步:打包成 .o文件

第二步:创建.a文件

第三步1:当前目录下通过-L. .a文件进行编译

第四步1:运行结果

第三步2:不在当前目录下面加-L. .a文件编译,此时就必须的改名为libshow.a;然后移到/lib64目录下面,在编译时加上参数:-lshow

第四步2:运行结果

以上就是静态库的制作了,按照规定流程走,最好都制作为libxxxxx.a

  a、先生成.o文件;

  b、打包成libxxxx.a文件;

  c、此时2种编译途径,当前目录下利用-L. libxxx.a或-lxxxx进行编译;

  d、只要编译成功,放之四海皆可执行--------->因为利用静态函数库编译的文件比较大

3、动态库的制作

.so:用在版本升级上有优势;核心参数:-shared -fpic

gcc -shared -fpic -o libshow.so show.c    :-fpic->产生位置无关代码 -shared:->生成共享库

样例实现

第一步:实现创建libxxxx.so文件

第二步:将libxxxx.so文件移动到/lib64下

第三步:运行编译

注意:

  (1)、动态库只有这一种编译运行的方式,必须将.so文件放到/lib64目录下,且文件名必须为libxxx.so;

  (2)、静态库的libxxx.a文件不放,也可以编译运行成功;

4、动态加载

在运行时才被加载到内存当中,效率相当的高;编译时要在最后加一个选项:-ldl

  通过一系列的API完成;


用C语言实现:

第一步:先创建一个libxxx.so文件

第二步:写加载的程序

test.c

#include"show.h"
#include<dlfcn.h>typedef void(*pFun)(char *);   //定义实现该方法的函数指针int main(void){void *d1 = dlopen("libshow.so", RTLD_LAZY);  //打开这个动态库文件if(d1 == NULL){perror("dlopen");return -1; }   pFun pfun = (pFun)dlsym(d1, "show");  //寻找名称为show的函数pfun("abcd");  //找到之后,函数指针在接着调用即可dlclose(d1);return 0;
}

第三步:直接进行编译运行,在最后加上参数:-ldl

这样就实现了动态加载.so文件的方法;

用C++实现:

(1)、第一步:创建一个libxxx.so文件

(2)、第二步:移动到/lib64下

(3)、第三步:编译运行

此时发送了段错误;

分析:

  (1)、C语言找函数名称没有问题;

  (2)、C++在动态链接库中找不到函数名字;因为C++具有重载,其函数名称早已经不是我们所看到的函数名称;

解决方案:

  (1)、通过汇编,找其对应的函数名称;

  (2)、extern "C" ,扩展C,用C的特性即可;

改进的代码如下:

/
show.h
#ifndef _SHOW_H_
#define _SHOW_H_#include<stdio.h>
#include<iostream>
using namespace std;extern "C" void show(char *str);  //扩展C,使其拥有C的性质(就将这个函数当做C语言解释),函数名称就是我们所看到的,好找函数名称#endifshow.cpp
#include"show.h"extern "C" void show(char *str){cout<<str<<endl;
}
///
test.cpp
#include"show.h"
#include<dlfcn.h>typedef void(*pFun)(char *); int main(void){void *d1 = dlopen("libshow.so", RTLD_LAZY);if(d1 == NULL){perror("dlopen");return -1; }   pFun pfun = (pFun)dlsym(d1, "show");pfun("abcd");dlclose(d1);return 0;
}



转载于:https://blog.51cto.com/wait0804/1857190

静态库与动态库的制作相关推荐

  1. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  2. 关于VS2013下制作和使用静态库和动态库

    关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接.将一个程序编译成可执行程序的步骤: 静态库在链接阶段,会将汇编生成的目标 ...

  3. 关于VS环境下制作和使用静态库和动态库

    转载理由:虽然操作什么的很基础,不过作为初学还是很好的文章,手把手教学 关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接. ...

  4. linux下静态库和动态库的制作与使用

    1.首先先介绍一下什么是静态库.什么是动态库? 静态函数库: 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了 ...

  5. Linux下C++静态库、动态库的制作与使用

    参考博文:C++静态库与动态库 >> 静态库 1. 静态库的制作 a) 编辑 name.cpp 和name.h文件 b) $g++ -c name.cpp //注意带参数-c,否则直接编译 ...

  6. Linux静态库与动态库的概念及制作

    目录 一.静态库 二.动态库 3.静态库的制作 4.动态库的制作 在日常编程中我们不想让别人看到我们写的源码,但还需要发给对方使用,在这种情况下我们引入了静态库动态库,让对方用调库的方式也可以实现我们 ...

  7. c/c++静态库和动态库制作

    1.什么是库 库lib是编译好的二进制代码,可以被操作系统载入内存执行,一般是预先编译好的函数的集合,可以通过头文件链接到库文件,执行已经编译好的代码段. 库一般分为静态库(static lib,在l ...

  8. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

  9. 手把手教学制作静态库和动态库

    In life, as in whist, hope nothing from the way card may be dealt to you. Play the card, whatever th ...

  10. Linux下制作和使用静态库和动态库

    写在前面: ldd + 可执行文件 可以查看可执行文件所依赖的库 概述: Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib ...

最新文章

  1. 微信界面代码android,仿微信界面代码安卓版
  2. 8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出)
  3. PostgreSQL的 initdb 源代码分析之二十一
  4. VUEX封装module
  5. apicloud mysql 登录_PHP+MySQL实现前台的登陆注册。
  6. 红帽wps linux安装包,rhel6(centos)安装WPS最新版
  7. php 三菱plc,三菱plc编程
  8. Linux多线程编程-线程间参数传递
  9. 【图解深度学习】【章节:2-1.1 | 什么是机器学习?】连小学生都能看懂的深度学习基础总结
  10. 3D游戏设计-打飞碟
  11. ADB投屏_智能安全帽出厂配置调测工具最优之选:投屏神器Qtscrcpy
  12. 连续41次通过VB100认证,腾讯安全技术实力再获国际权威认可
  13. 面试Vue架构师,封装一个万能表单生成器
  14. postman接口导入
  15. 外文论文_屏幕外文本用于复制和粘贴
  16. fpga板子怎么和电脑连_[笔记].怎样正确插拔FPGA开发板的JTAG仿真器,如USB-Blaster等?...
  17. Leetcode 317. Shortest Distance from All Buildings (python+cpp)
  18. numpy到pytorch,鸟枪换炮
  19. 训练集、验证集、测试集划分
  20. 如何随时远程开机并控制电脑

热门文章

  1. pgm图像缩小C语言,C++将二进制(P5)图像转换为ascii(P2)图像(.pgm)
  2. 随手记---Python字典 del用法
  3. php 实现静态链接,在PHP中链接静态方法?
  4. java docker client_Docker Client (another java docker client api)
  5. java图书购买系统的项目_JAVA入门第三季项目(图书查找系统)
  6. 64位userdata.dll丢失_因为计算机中丢失OCI.dll尝试重新安装该程序以解决此问题
  7. 关于内存泄漏检测问题,和大家一起分享
  8. 戴尔Any Cloud 助力企业快速实现云转型
  9. 會議管理系統--項目總結
  10. SQLite.Net操作类