Linux第一个动态库
动态库一般以.so结尾,就是shared object的意思.
其基本生成步骤为 ⑴编写函数代码 ⑵编译生成动态库文件,要加上 -shared 和 -fpic 选项 ,
库文件名以lib开头, 以.so 结尾。 -fpic 使输出的对象模块是按照可重定位地址方式生成的。-shared指定把对应的源文件生成对应的动态链接库文件libstr.so文件。使用方式分为两种: 隐式调用和显示调用 隐式调用类似于静态库的使用,但需修改动态链接库的配置文件/etc/ld.so.conf; 显示调用则是在主程序里使用dlopen、dlsym、dlerror、dlclose等系统函数。
第一个简单的动态库编写:
-----------func.h-----------
#include <stdio.h>
void ShowHello();
----------func.c-----------
#include "func.h"
void ShowHello()
{
printf("show hello func called \n");
}
gcc -fpic -shared -o libTest2.so func.c 生成 动态库 libTest2.so
动态库显示调用:
------------uselib.c-----------------------
#include <dlfcn.h>
#include "func.h"
#include <stdio.h>
int main()
{
void(*pFun)();
void* pdHandle=dlopen("/mnt/hgfs/LinuxShare/cplus/TestLib2/libTest2.so",RTLD_LAZY);
if(!pdHandle)
{
printf("dlopen failed \n");
return -1;
}
char* errCh=dlerror();
if(NULL!=errCh)
{
printf("dlerror \n");
return -1;
}
pFun=dlsym(pdHandle,"ShowHello");
errCh=dlerror();
if(NULL!=errCh)
{
printf("dlerror2 \n");
return -1;
}
(*pFun)();
dlclose(pdHandle);
return 0;
}
通过命令 gcc -o uselib -ldl uselib.c 编译生成可执行文件 uselib -ldl 选项表示 用到了共享库
./uselib 执行 可打印出 show hello func called
————————————————
版权声明:本文为CSDN博主「mtour」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mtour/article/details/8274200
Linux第一个动态库的更多相关文章
- 【转】分析Linux和windows动态库
原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Lin ...
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Linux和windows动态库
转载:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 态链接库技术实现和设计程序常用的技术,在Windows和Linux系 统中 ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- linux下so动态库一些不为人知的秘密(转)
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库, ...
- linux下so动态库一些不为人知的秘密
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识. 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些 ...
- linux下so动态库一些不为人知的秘密(中二)
继续上一篇< linux下so动态库一些不为人知的秘密(中) >介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只 ...
- linux下so动态库一些不为人知的秘密(中)
上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题. 我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序 ...
随机推荐
- JAVA 中日志的记录于使用
java中常用的日志框架 日志接口 Commons Logging Apache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型.它通过其他一 ...
- C语言:最小公倍数
//求最小公倍数 #include <stdio.h> main() { int m,n,i,k,max,min; scanf("%d,%d",&m,& ...
- C语言:整数保存 原码 反码 补码
#include <stdio.h> /* 本题结果为:-4 short类型占据2字节 ;赋值后实际占据了3个字节,所以有溢出警告提示,结果只保留0xfffc 保存二进制:1111 111 ...
- 【LeetCode】523. 连续的子数组和
523. 连续的子数组和 知识点:数组:前缀和: 题目描述 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且 ...
- Python基础之函数的闭包与装饰器的介绍
1.闭包的概念: 如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包. 2.话不多说,以demo示例: de ...
- 简单快速安装Apache+PHP+MySql服务环境(四)—— 将php版本升级到7.2
书接上文,简单快速安装Apache+PHP+MySql服务环境(二)-- centos使用yum安装指定版本的php. 随着各种PHP框架的升级,对PHP的版本也有了更高的要求,所以笔者也尝试着更新升 ...
- 第十篇 -- 学习C++宝典2005版
最近看了C++宝典,看时间是2005的,对于里面的程序自己也进行了编写,由于时间过久,可能有些函数的用法发生了改变,自己也对其进行了修改,用VS2017可以编译通过. 前四章学习内容 CPlusPlu ...
- vue-- 利用过滤-实现搜索框的姓名的搜索
<div class="fl w-200 m-l-30"> <el-input placeholder="输入用户名" v-model=&qu ...
- 🔥 LeetCode 热题 HOT 100(61-70)
207. 课程表 思路:根据题意可知:当课程之间不存在 环状 循环依赖时,便能完成所有课程的学习,反之则不能.因此可以将问题转换成: 判断有向图中是否存在环.使用 拓扑排序法 : 构建 入度表:记录每 ...
- 手撸一个SpringBoot-Starter
1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...