LINUX C语言:程序运行时动态加载库函数

Linux C 之动态库加载   Linux 可以在程序运行时加载动态库,具体操作如下: 程序需要包含头文件#include<dlfcn.h> 该头文件包含dlopen(),   dlerror(),  dldlsym()  ,dlclose()函数API 用于加载动态函数库的相关操作。 #include <dlfcn.h> void *dlopen(const ch... 阅读详情

PS:相关知识请自己去看man手册,这里只给出一个实例,及创建这个实例的步骤。


1:创建test.h, test.c文件

//test.h
#ifndef TEST_H_
#define TEST_H_

#include <stdio.h>

void PrintHello();
int Add(int a, int b);

#endif


//test.cpp
#include "test.h"

//输出文本hello, world
void Hello()
{
	printf("hello, world\n");
}

//返回两个参数的和
int Add(int a, int b)
{
	return a + b;
}


2:将其编译成动态库
gcc test.c -shared -fPIC -o libtest.so

3:创建主文件main.c

//main.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <signal.h>
#include <errno.h>

//输出错误信息并退出      
void error_quit(const char *str)      
{      
	fprintf(stderr, "%s\n", str);   
	exit(1);      
}  

int main(int argc, char *argv [])
{
	void *plib;						//指向so文件的指针
	typedef void (*FUN_HELLO)();
	typedef int (*FUN_ADD)(int, int);
	FUN_HELLO funHello = NULL;		//函数指针
	FUN_ADD funAdd = NULL;

	//打开so文件
	//为了方便演示,我将库文件和可执行文件放在同一个目录下
	plib = dlopen("./libtest.so", RTLD_NOW | RTLD_GLOBAL);
	if( NULL == plib )
		error_quit("Can't open the libtest.so");

	//加载函数void Hello()
	funHello = dlsym(plib, "Hello");
	if( NULL == funHello )
		error_quit("Can't load function 'Hello'");
	
	//加载函数int Add(int a, int b)
	funAdd = dlsym(plib, "Add");
	if( NULL == funAdd )
		error_quit("Can't load function 'Add'");

	//调用成功加载的函数
	funHello();
	printf("5 + 8 = %d\n", funAdd(5, 8));

	//关闭so文件
	dlclose(plib);

	return 0;
}


4:编译,运行

gcc main.c -o main -ldl
./main

完成了,呵呵

Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL c++动态库调用另一个动态库 c++动态库调用c动态库 c#等其他语言调用c/c++动态库 立即下载

相关推荐

4D毫米波雷达点云可视化实战:从CANFD原始数据到Matplotlib三维动态图

本文详细介绍了4D毫米波雷达点云可视化实战,从CANFD原始数据解析到Matplotlib三维动态图实现的全流程。通过解析CANFD数据帧结构、点云数据编码原理,并结合Python实现CANFD通信接口,帮助开发者掌握4D雷达数据处理与优化技巧,最终实现高性能的3D点云动态可视化。

u9v0w的博客 568

Linux操作系统关于动静态库的操作

介绍了动态库和静态库的生成、发布以及使用方法

博客记录学习轨迹,方便日后复习 613

如何用ISBN API快速获取图书信息?Python实战教程(附完整代码)

本文是一篇Python实战教程,详细介绍了如何利用ISBN API高效获取图书元数据。内容涵盖从API服务选择、密钥管理,到使用requests库构建健壮的请求模块,并利用Pydantic进行数据验证与解析。教程还提供了批量查询、缓存优化及集成到Flask Web应用等高级技巧,帮助开发者快速实现图书信息的自动化获取与处理。

p8q9r0的博客 455

Linux----静态函数库和动态函数库制作

本文讲解了在LIinux系统下,静态函数库和动态函数库的制作,并且讲解了他们如何整合进可执行程序中的,并且讲解了他们的区别

weixin_52042488的博客 896

数学建模小白必看:层次分析法(AHP)从入门到实战(附Python代码)

本文详细介绍了层次分析法(AHP)在数学建模竞赛中的应用,从构建判断矩阵到一致性检验,再到权重计算和实战案例。通过Python代码实现,帮助小白快速掌握AHP的核心技巧,解决评价类难题,提升建模效率。

web39explorer的博客 918

超详细版!Obsidian+Claude+Skills+云同步,打造智能 AI 知识库

本文介绍如何搭建高效的AI知识管理系统,将Obsidian笔记工具与ClaudeAI助手深度整合。通过ClaudeCode安装配置、ObsidianSkills插件添加和坚果云同步设置,实现本地存储安全性与云端便捷性的完美结合。该系统支持智能笔记整理、知识图谱可视化、智能搜索问答和内容创作辅助等功能,使静态笔记转变为能自动分析关联、处理复杂结构的"活"知识库。详细步骤包括工具准备、环境配置、插件安装和云同步设置

2301_79998006的博客 1078

Linux:静态库、动态库的生成与使用

介绍了动态库和静态库的生成和使用。在库文件的使用中,需要注库文件的路径问题,介绍了几种解决问题的办法:添加库文件到指定路径、配置环境变量。

weixin_57761086的博客 2613

深入解析:如何在Visual Studio中高效编译libredwg与libdxfrw

本文详细介绍了在Visual Studio中高效编译libredwg与libdxfrw的完整流程,包括环境配置、源码获取、CMake技巧及常见错误解决方案。针对CAD开发者,提供了从基础编译到项目集成的实用指南,帮助快速处理DWG/DXF文件,提升开发效率。

weixin_29215391的博客 232

linux添加c语言的库,Unix/linux 创建c语言函数库 方法 实例 (未完成)

dlclose(handle);}如果这个程序名字叫foo.c,那么用下面的命令来编译:gcc -o foo foo.c -ldl5. 其他5.1. nm命令nm命令可以列出一个函数库文件中的符号表。它对于静态的函数库和共享的函数库都起作用。对于一个给定的函数库,nm命令可以列出函数库中定义的所有符号,包括每个符号的值和类型。还可以给出在原程序中这个函数(符号)是在多少行定义的,不过这必须要求编译...

weixin_34206129的博客 413

Qt代码-军用仿真系统基础框架

ui->mapClickLabel->setText(QString("地图点击:(%.1f, %.1f)米").arg(worldPos.x()).arg(worldPos.y()));emit simulationEvent(QString("添加实体: %1 (ID: %2)").arg(attr.name).arg(entity.id()));// 像素坐标→世界坐标(米)

寒寒豆豆软件公司的博客 168

DeepSmote:一种深度SMOTE方法

DeepSmote 一种全新的将深度学习与Smote相结合的过采样方法! 目前在许多领域已经被使用,值得大家关注学习!

走在深度学习前沿的小宋 1445

linux 如何运行函数,linux下如何运行c++程序(包括调用外部函数库)

这个问题困扰了我好久,但在网路上搜索很久也没有找到具体的,条理清晰的一篇。所以,自己动手丰衣足食(拖拖拖了一个月。。)运行c++程序事实证明gcc是理解不了c++的。。用g++运行你的程序,比如:g++ main.cppg++产生一个.out文件,如果跳转到下一句就意味着执行成功(废话)。这时如果没有指定名字的话,就是a.out文件(用-o 指定编译后的名字)./a.cout就能执行那个c++程序...

weixin_42510914的博客 310

YOLOv12创新改进 | 全网独家创新篇、小目标检测改进 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLOv12有效涨点

本文提出了HS-FPN(高频和空间感知特征金字塔网络),通过HFP(高频感知)模块增强小目标特征,SDP(空间依赖感知)模块捕获像素间空间依赖关系。实验在AI-TOD等小目标数据集上验证了该方法的有效性,相比FPN显著提升检测性能。文章详细介绍了HS-FPN的网络结构、核心代码实现及在YOLOv12中的应用方法,并提供多种改进版本的yaml配置文件,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 336

Linux C语言:程序运行时动态加载库函数

1:创建test.h, test.c文件//test.h#ifndef TEST_H_#define TEST_H_#include <stdio.h>void PrintHello();int Add(int a, int b);#endif2:将其编译成动态库gcc test.c -shared -fPIC -o libtest.so3:创建主文件main.c...

weixin_34397291的博客 282

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c运行时库 linux,Linux C语言:程序运行时动态加载库函数

PS:相关知识请自己去看man手册,这里只给出一个实例,及创建这个实例的步骤。1:创建test.h, test.c文件//test.h#ifndef TEST_H_#define TEST_H_#include void PrintHello();int Add(int a, int b);#endif2:将其编译成动态库gcc test.c -shared -fPIC -o libtest.so...

weixin_39914732的博客 238

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

汇编语言使用C库函数和Linux动态链接

使用printf 代码 #cpuid2.s -- Using C labrary calls .section .data output: .asciz "The processor Vender is '%s'\n" .section .bss .lcomm buffer, 12 .section .text

编程的本质是数学问题 2418

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux:动态库的加载原理和与进程的知识整合

答案是有的,这是因为当程序被编译之后,所有的函数名变量名等等内容,都不再会存在,取而代之的是一个一个的地址,从汇编代码的角度来讲,每一步的跳转背后都是一个一个的地址,比如当前在函数的内部定义了一个临时变量,这个临时变量是在栈区存在的,但是此时可执行程序中可并没有栈,栈是在程序加载到内存中运行的时候才有栈区的概念,但是不影响,这个变量是在函数的内部形成的,这也就意味着在形成变量的时候,是通过寄存器为出发点,再加上偏移量,就可以进行访问,所以最终函数名变量名都是地址了。为什么叫做共享库呢?

生活需要深度 1528

【C语言动态库加载核心技术】:深入解析显式加载与卸载的5大关键步骤

掌握C语言动态库的显式加载与卸载核心技术,解决跨平台插件开发难题。涵盖dlopen、dlsym、dlclose等关键函数应用,适用于模块化设计与热更新场景。方法清晰、稳定性高,值得收藏。

VarChat的博客 1039

在汇编语言中使用C库函数

在 GNU 汇编: 第一个汇编程序 中, 利用Linux 系统调用将读到的 cpuid 显示到控制台上, 还有不使用系统调用的其他方法, 其中一种就是使用 C 库函数. 实例 demo.s .section .data output: .asciz "The processor Vender ID is '%s'\n" .section .bss .lcomm buffer, 12 .section .text .globl _start _start: // 获取 CPU

qq_36525177的博客 1001

浅析Linux下gcc环境的C语言运行

一)、Linux中的程序运行过程。 1、在使用gcc -g -Wall **.c -o ** -v命令后: -g:可以在可执行文件里面添加调试信息 -Wall:W是警告的意思,all则是所有,因此这条语句可以帮助显示所有警 告信息 -v:这条语句可以显示在编译时的所有信息 下面是执行命令后显示的基础信息:包括执行编译的版本信息以及进行库函数的搜索信息 2、在使用readelf语句后,我们查看了...

LOONG 3159

【万能皆可链接】C++中的动态链接库编译与加载库函数,Cython编译后的.so使用C++加载

什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库, 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so 静态库 在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。 静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定.

weixin_43953700的博客 2318

Linux 下的静态库和动态库(C语言)

本篇摘要: ①关于库的一些简单介绍 ②静态库和动态库各自的特点介绍 ③静态库和动态库各自的创建过程

Ljt030608的博客 1105

Linux程序运行中加载动态库

Linux程序运行中加载动态库Linux C/C++程序通常是在编译的时候链接依赖的动态库. 同时,也提供一种在运行时加载动态库的方法.(具体man dlopen中有说明和使用范例.)应用的场景,暂时想到是 : 类似插件.不用更新整个应用程序,通过更新或新增动态库,实现更新或者增加功能. 在之前的一个开源的项目streamtunner中就有使用这种. 用户可以更新或自行新增网络源.方便更新和

Freeze_Z的专栏 1420

C语言调用C++实现的库函数方法

C语言调用C++实现的库函数方法Linux 平台Windows 平台 在 C 语言代码工程中经常会用到其他高级语言生成的动态、静态库函数,对于这种情况就需要进行特别处理。本文针对 C++ 实现的一系列库函数在 C 语言代码中的调用方式进行研究说明。 Linux 平台 首先,需要在库函数的头文件中使用 extern C 进行函数声明,使得 C 语言在包含头文件的时候也能够获得函数声明。具体如下: 自定义实现一个 C++ 打印函数,源代码: #include "myprint.h" #include <i

跑不了的你的博客 2947

C语言运行时

如果你是做系统开发或高级语言(如 Python、Java)开发,这种“运行时”的理解会帮助你更清晰掌握程序行为背后的逻辑。指的是程序在运行时依赖的一组代码、机制或服务,叫做“运行时库”(runtime library)或“运行时系统”(runtime system)。的执行流程,是理解 Linux 下程序运行机制的关键。下面我们分阶段详解它的全过程,包括涉及的关键符号、运行时库(CRT)、系统调用等。这是“时间”上的意义,指从程序启动开始执行,到退出这一段时间。到了这一步,程序正式进入你编写的逻辑。

is0815的博客 948
上一篇: C++:在程序中获取全球唯一标识号(GUID或UUID)
下一篇: 每个人的青春都有一条弯路,你要自己走
AAA20090987
博客等级 码龄18年 585粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值