Linux下动态库so的生成与使用

C++文件如何在linux下生成动态库So,以及如何使用这个动态库 不同组件之间,如何提供一个动态库给其他Team使用,这样使用者也不需要关心和维护你的代码。 Java中经常的做法就是打成Jar包,Windows C++ 通常会打成 动态链接库和静态的链接库。 Linux 下,我经常的做法就是把C++ Soure 文件打包成.so 1.如何把C++ Src文件打包成.so  下图显示就是我要打包成的几个.so Command: g++ s 阅读详情


一.  编写个C文件:test.c

 

[cpp] viewplaincopyprint?

1. #include<stdio.h>  

2. // file test.c  

3. int say()  

4. {  

5.     printf("Hello, Linux so\n");  

6.     return 0;  

7. }  

8.   

9. int add(int x, int y)  

10. {  

11.     return x+y;  

12. }  


二. 编译成动态库 .so :

 

 

[plain] viewplaincopyprint?

1.  ~ # gcc -shared -o test.so test.c  

2. /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/cc3GkPar.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC  

3. /tmp/cc3GkPar.o: could not read symbols: Bad value  

4. collect2: ld returned 1 exit status  


出错了,说是要加个 -fPIC 参数(编译成位置无关代码,不然你的程序在别的地方肯可能运行不了):

 

 

[plain] viewplaincopyprint?

1. ~ # gcc -fPIC -shared -o test.so test.c  


OK
,成功!

 

 

三.  C语言中使用使用该动态库(test.so)

1. 编写C file

 

[cpp] viewplaincopyprint?

1. #include<stdio.h>  

2. // file: myso.c  

3. int main()  

4. {  

5.     say();  

6.     printf("%d\n",add(3+4));  

7.     return 0;  

8. }  


2.
编译

 

 

[plain] viewplaincopyprint?

1. ~ # gcc -o myso myso.c /root/test.so  

 

3. 运行

 

[plain] viewplaincopyprint?

1. ~ # ./myso  

2. Hello, Linux so  

3. 1697202183  


结果明显不正确,3+4 怎么会是 1697201283 ?  原来,add(3+4) 参数传错了 !!

 

 

四. Python中使用

1. 编写Python 文件

 

[python] viewplaincopyprint?

1. #!/usr/bin/python  

2. from ctypes import *  

3.   

4. myso = cdll.LoadLibrary('/root/test.so')  

5.   

6. myso.say()  

7.   

8. add = myso.add  

9. add.argtypes = [c_int, c_int]    #传入参数类型  

10. add.restype = c_int              #返回值类型  

11.   

12. print add(2,3)  


2.
使用

 

 

[python] viewplaincopyprint?

1.  ~ # python myso.py  

2. Hello, Linux so...  

3.  

4. 5  

 

http://blog.sina.com.cn/s/blog_7769660f01011pf1.html

Linux+qt:创建动态库so,以及如何使用(详细步骤)_linux qt 生成动态库 *4)**然后可以在demo文件中添加Headers,Sources,Resources等文件~,如此一来下次使用就直接引用这个demo文件的内容即可。**2)**在demo文件夹下新建一个pri文件(名为demo)。(1).pri文件功能:把额外用到的一些自定义组件放在一个文件中,方便调用,使用的时候采用include引用即可。**3)**打开Qt Creator ,在你的项目的Pro文件中加入相关的 .pri文件。**1)**打开项目文件夹,在这里面新建一个文件夹(名为demo); 阅读详情

相关推荐

Android 编程 在 Linux 环境下创建.so动态库

Android编程过程中,在Linux 环境中编译C、C++文件生成.so文件

linux 编译x86.so,解决Linux程序编译链接动态库版本的相关问题

前言不同版本的动态库可能会不兼容,如果程序在编译时指定动态库是某个低版本,运行是用的一个高版本,可能会导致无法运行。Linux上对动态库的命名采用libxxx.so.a.b.c的格式,其中a代表大版本号,b代表小版本号,c代表更小的版本号,我们以Linux自带的cp程序为例,通过ldd查看其依赖的动态库$ ldd /bin/cplinux-vdso.so.1 => (0x00007ffff5...

weixin_39883208的博客 756

Linux动态链接库.so文件的创建与使用

Linux动态链接库.so文件的创建与使用

Linux 下 动态链接库 .so 的生成和使用

 创建 .so 文件跟一般的ELF文件的生成相似,不同之处在于:1、添加 -fPIC -shared作为gcc的选项;其中:PIC表示 Position Independent Code,用于指示gcc将.c文件编译为目标代码.o;-shared用户指示gcc连接器输出T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。2、输出文件名附加lib前缀,附加.

freezing point·J 2247

振动信号相位测量的关键技术解析

本文深入解析了振动信号相位测量的关键技术,强调相位是振动信号的“身份证”,对于动平衡和故障诊断至关重要。文章详细阐述了键相传感器与振动传感器的选型、安装要点,以及时域和频域(FFT)核心算法,并针对现场噪声、转速波动等挑战提供了实战解决方案,帮助工程师实现精准、稳定的相位测量。

vv45678的博客 838

伪距单点定位算法原理以及利用最小二乘法计算实例

即该公式:建立下列代价函数满足最佳估值的条件为:即:可解得未知参数 X 的最佳估值由于每个可见卫星观测量的精度可能不一样,这时,需要对不同观测量赋予一个权重系数,称为加权。

qq_43381998的博客 1万+

Linux下gcc编译生成动态链接库*.so文件并调用它

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。 1、动态库的编译 下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件

忘不烦的专栏 1507

AIGC大模型应用教学平台

该平台采用最新的AI推理加速芯片,提供30Tops算力和32GB存储,能够运行常见的大语言模型如ChatGLM2、Llama2、Baicuan、Mistral等,也可以运行文生图扩散模型Stable Diffusion,提供大模型微调、量化、转换和加速推理服务。在此基础上,平台还提供常见的生成式AI应用,包括AIGC知识抽取增强(RAG)、AIGC绘画、AIGC会话聊天、数字虚拟人等应用,以便学生能够掌握最新的生成式AI模型微调、提示工程和智能体应用技能。

中智讯的博客 1204

Delphi 开发so库,Delphi 调用SO库

IDE:Delphi 10.3.3 一.编写SO库 新建一个项目 项目右键Add Linux Platform 然后项目就变为.so 添加代码 library mySO; uses System.SysUtils, System.Classes; {$R *.res} function testStr: TStringList; cdecl; var str: string; strlist: TStringList; begin str...

1665

用逻辑分析仪实测EM4095:125kHz RFID耳标解码的电压与脉宽玄学

本文通过逻辑分析仪实测EM4095芯片,深入解析125kHz RFID耳标解码中的电压与脉宽关联现象。揭示了供电电压对曼彻斯特编码脉宽的影响规律,并提供了一套可落地的调试方法论,包括信号链路解析、逻辑分析仪配置技巧及系统级稳定性提升方案,帮助开发者解决解码不稳定问题。

weixin_30629653的博客 328

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 715

静态库.a和动态库.so文件的生成和使用

本文主要讲解了静态库和动态库的生成,以及.o文件和.so文件的使用。

古先生的博客 4155

Hexo博客使用PDF.js

clone了一个pdf.js 然后兴高采烈地到文章里使用{% pdf %}标签 结果浏览器弹出了个下载框(使用GitHub的raw) 不知道是不是因为使用GitHub的原因导致这个问题 后来我测试的时候报了个错 优快云上的解决方法 到时候我再试试把资源放回lib/里面看看行不行 目录1.clone1.1.官方方法1.2.NexT主题方法1.3.补充2.修改文件2.1.修改viewer.htm...

LTFan 961

Linux下使用gcc生成动态库.so和调用(图文并茂,坑已踩完)

简 述: 继 上一篇。本篇就继续实践踩坑,实现在Linux上面,使用gcc编译动态库.so,文件,且调用动态库。此处例子实际:使用g++8.3.0在uos20(Linux)平台下完成这个知识点的实践教程。 文章目录编程环境:动态库概念:前期铺垫:将.cpp文件生成.o文件:将.o文件大包为.so文件:调用.so文件:设置.so的运行时的PATH:解决 Linux 加载动态库 .so 文件失败的...

1万+

Python航空航天设计神器!从入门到实操,小白也能搞定飞机优化

AeroSandbox的核心价值的是:​降低航空工程优化的门槛,用Python实现高效、简洁的工程设计​。无论是科研、学习还是实际项目,它都能帮你节省大量时间,不用再手动推导导数、编写复杂的优化逻辑。对于新手来说,建议先从案例1(Rosenbrock函数)入手,熟悉优化流程,再尝试案例2(翼型优化),逐步掌握核心用法;对于有航空相关需求的小伙伴,可以深入研究内置的物理模型,结合自己的项目进行定制化开发。最后,互动时间到!👉 你是用AeroSandbox做科研、练手还是实际项目?

源代码杀手的博客 124

Three.js 完整实战项目:构建一个 3D 商品展示空间

Three.js 作为强大的 WebGL 框架,广泛应用于交互式 3D 场景开发,尤其适合创建沉浸式商品展示空间。本文将通过一个完整的实战项目,展示如何构建一个 3D 商品展示空间,涵盖项目架构、资源组织、多模型切换、交互热点绑定、移动端适配和帧率优化。项目以展示虚拟商品(如家具或电子产品)为核心,结合用户交互,基于 Vite、TypeScript 和 Tailwind CSS,支持 ES Modules,确保响应式布局,遵循 WCAG 2.1 可访问性标准。本文适合希望通过综合项目掌握 Three.js

zimin的专栏 1462

Linux下Eclipse进行C++编程动态库so的生成与使用

本文主要介绍了Linux使用Eclipse进行C++编写动态库so 的生成与使用方法,提供示例代码,并给出部分编译错误的解决方案。

Ron的专栏 9371

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux下静态库(.a)和动态库(.so) 的生成与使用

“                 很多崩溃其实都发生在安静里,你坐在那里一动不动,内心世界却已经坍塌粉碎,一地狼藉。                                                                                                                                           ...

I-am-Unique 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在linux上使用Qt开发动态库项目,怎么只生成一个so文件

在linux系统上,我们使用 Qt 开发动态库项目时,会默认生成四个文件:x.so 、x.so.1 、x.so.1.0、x.so.1.0.0。我们交付的时候,不可能发一堆文件出去,所以我们需要对 Qt 项目进行设置,保证输入的只有一个 so 文件。在linux上使用Qt开发动态库项目,怎么只生成一个so文件。四个文件,只有一个真实的so库,剩下的三个都是链接文件。这样编译后,就会只编译出一个 so 库。

hmwz0001的博客 839

温度PID控制PLC程序

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

Linux 下用gcc生成静态库和动态库以及静态库.a与.so库文件的生成与使用

Linux 下用gcc生成静态库和动态库一、用 gcc 生成 .a 静态库和 .so 动态库1.创建一个 test1 文件夹在该文件夹中创建三个子程序 hello.h、hello.c 和 main.c下面展示一些 `内联代码片`2.将 hello.c 编译成.o 文件3.由 .o文件创建静态库4.在程序中使用静态库5.由.o 文件创建动态库文件6.在程序中使用动态库7.当静态库和动态库同名时,gcc 命令会使用哪个库文件二、(1)Linux 下用静态库.a文件的生成与使用1.用 vim编辑器编辑生成所需要的

weixin_46584792的博客 803

Linux 环境下gcc生成静态库.a和动态库.so文件以及其使用

静态库(.a)编译时嵌入程序,可独立运行、效率高,但体积大、更新需重编;动态库(.so)运行时加载,体积小、可共享、更新方便,但依赖外部文件。二者均需先编为.o文件,静态库用ar打包,动态库需-fPIC和-shared。嵌入式用静态库,系统级应用选动态库,也可混合用平衡需求。

m20050212的博客 1116

Linux下C程序动态库.so和静态库.a的生成和使用

这个错误是在动态库执行的时候经常会遇到,说找不到这个.so文件,如果放在/lib或者/usr/lib下,那么默认就能找到。比如程序的源文件为:main.c【我创建的目录是/root/host/my_program/asoc/my_program】比如程序的源文件为:test.c【我创建的目录是/root/host/my_program/asoc/my_program】我在路径/root/host/my_program/asoc/include下创建下面的文件。下面通过一个小栗子介绍如何生成一个动态库。

u011563926的专栏 669

【库函数】Linux下动态库.so和静态库.a的生成和使用

本文介绍了在Linux环境下生成和使用动态库(.so文件)的方法。通过使用GCC编译器以及相关选项如-fPIC和-shared,作者详细说明了如何将一组C语言源文件编译成一个动态链接库。同时,文章提供了如何在编译其他程序时链接动态库的示例,以及在运行时如何解决动态库找不到的问题。通过本文,读者能够了解动态库的生成过程以及在实际项目中的应用场景,加深对动态库在Linux系统下的使用方法的理解。

朝花夕拾 4716
上一篇: /bin/sh^M: bad interpreter:没有那个文件或目录解决
下一篇: 如何在C语言中调用shell命令
常用技术
博客等级 码龄17年 91粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值