静态库与动态库的制作
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
静态库与动态库的制作相关推荐
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- 关于VS2013下制作和使用静态库和动态库
关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接.将一个程序编译成可执行程序的步骤: 静态库在链接阶段,会将汇编生成的目标 ...
- 关于VS环境下制作和使用静态库和动态库
转载理由:虽然操作什么的很基础,不过作为初学还是很好的文章,手把手教学 关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接. ...
- linux下静态库和动态库的制作与使用
1.首先先介绍一下什么是静态库.什么是动态库? 静态函数库: 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了 ...
- Linux下C++静态库、动态库的制作与使用
参考博文:C++静态库与动态库 >> 静态库 1. 静态库的制作 a) 编辑 name.cpp 和name.h文件 b) $g++ -c name.cpp //注意带参数-c,否则直接编译 ...
- Linux静态库与动态库的概念及制作
目录 一.静态库 二.动态库 3.静态库的制作 4.动态库的制作 在日常编程中我们不想让别人看到我们写的源码,但还需要发给对方使用,在这种情况下我们引入了静态库动态库,让对方用调库的方式也可以实现我们 ...
- c/c++静态库和动态库制作
1.什么是库 库lib是编译好的二进制代码,可以被操作系统载入内存执行,一般是预先编译好的函数的集合,可以通过头文件链接到库文件,执行已经编译好的代码段. 库一般分为静态库(static lib,在l ...
- 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...
- 手把手教学制作静态库和动态库
In life, as in whist, hope nothing from the way card may be dealt to you. Play the card, whatever th ...
- Linux下制作和使用静态库和动态库
写在前面: ldd + 可执行文件 可以查看可执行文件所依赖的库 概述: Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib ...
最新文章
- 微信界面代码android,仿微信界面代码安卓版
- 8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出)
- PostgreSQL的 initdb 源代码分析之二十一
- VUEX封装module
- apicloud mysql 登录_PHP+MySQL实现前台的登陆注册。
- 红帽wps linux安装包,rhel6(centos)安装WPS最新版
- php 三菱plc,三菱plc编程
- Linux多线程编程-线程间参数传递
- 【图解深度学习】【章节:2-1.1 | 什么是机器学习?】连小学生都能看懂的深度学习基础总结
- 3D游戏设计-打飞碟
- ADB投屏_智能安全帽出厂配置调测工具最优之选:投屏神器Qtscrcpy
- 连续41次通过VB100认证,腾讯安全技术实力再获国际权威认可
- 面试Vue架构师,封装一个万能表单生成器
- postman接口导入
- 外文论文_屏幕外文本用于复制和粘贴
- fpga板子怎么和电脑连_[笔记].怎样正确插拔FPGA开发板的JTAG仿真器,如USB-Blaster等?...
- Leetcode 317. Shortest Distance from All Buildings (python+cpp)
- numpy到pytorch,鸟枪换炮
- 训练集、验证集、测试集划分
- 如何随时远程开机并控制电脑
热门文章
- pgm图像缩小C语言,C++将二进制(P5)图像转换为ascii(P2)图像(.pgm)
- 随手记---Python字典 del用法
- php 实现静态链接,在PHP中链接静态方法?
- java docker client_Docker Client (another java docker client api)
- java图书购买系统的项目_JAVA入门第三季项目(图书查找系统)
- 64位userdata.dll丢失_因为计算机中丢失OCI.dll尝试重新安装该程序以解决此问题
- 关于内存泄漏检测问题,和大家一起分享
- 戴尔Any Cloud 助力企业快速实现云转型
- 會議管理系統--項目總結
- SQLite.Net操作类