Linux编程练习(二)—— Linux下.so动态库的建立和调用

Linux C++,so动态库 示例实例 Linux C++,so动态库 示例实例 本文以Eclipse集成开发环境为例进行说明。 # 一、主要步骤 **(1)创建动态连接库(.so)工程** (1.1)建立.so工程; (1.2)添加MyHelloworld.cpp、MyHelloworld.h文件 (1.3)添加 -fPIC编译选项 (1.4)新增自定义成员函数:PrintHelloWorld函数 ............ 阅读详情

(在ubuntu 12.04系统下进行测试)

实现将一个自己编写的Hello.c文件打包成libHello.so动态库,并通过gcc编译工具实现用一个test.c程序调用libHello.so和自定义头文件Hello.h的过程。


具体程序代码如下:

//Hello.h文件

include <stdio.h>
void printhello();
//Hello.c文件

#include <stdio.h>
void printhello()
{
   puts("Hello World!");
}
//test.c文件

#include <Hello.h>
int main()
{
	printhello();
	return 0;
}

具体操作过程:
第一步:
    将文件Hello.c编译成一个动态库:libHello.so,执行命令如下:

        $ gcc Hello.c -fPIC -shared -o libHello.so

    -shared: 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接,相当于一个可执行文件;

    -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。


第二步:
    生成Hello.c文件的动态链接库libHello.so以后,直接在包含Hello.h和libHello.so文件夹底下运行如下gcc命令:

       $ gcc test.c -lHello -L. -I. -o test

     -L.:-L后跟连接库的路径,‘.’表示要连接的库在当前目录中(表示我要的库libHello.so请到后面跟的相应路径查询); 

     -I.:表示要连接的头文件在当前目录;

     -lHello:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称(其实这里-lHello就是表示使用libHello.so这个库的意思)。


第三步:
    执行命令“$ ldd test” 打印test可执行文件的动态库依赖关系,结果输出:

       linux-vdso.so.1 =>  (0x00007fff16b8a000)
       libHello.so => not found
       libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa55700c000)
       /lib64/ld-linux-x86-64.so.2 (0x00007fa5573e4000)


    其中,“libHello.so => not found”表明链接程序找不到libHello.so文件,这是因为链接程序只寻找固定目录(一般为/lib和/usr/lib),解决方法有两种:
    方法一:把libHello.so拷贝到链接程序的搜索路径目录下(/lib或/usr/lib)。
    方法二:设置环境变量LD_LIBRARY_PATH,增加当前路径到该变量中。
        配置环境变量的方法为:


          LD_LIBRARY_PATH = LD_LIBRARY_PATH:"当前路径名";
           export LD_LIBRARY_PATH

    这里采用第一种解决方法,再次执行“$ ldd test”,此时显示:


        linux-vdso.so.1 =>  (0x00007fff6c7d7000)
        libHello.so => /lib/libHello.so (0x00007f818dce3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f818d923000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f818defd000)


    libHello.so=>后有值,说明查找动态库成功。
    执行“./test”命令,正确输出相应结果。


php调用c语言编写的so动态库 PHP除了使用扩展库的方式调用c函数,还可以通过socket通信的方式。这里介绍前者。 第一步: 环境搭建 1. 先看本机是否已经安装了较低版本的php    #find /usr -name "php"    或者rpm -aq | grep php    如果存在,就使用rpm命令等方式卸掉 2. php源码安装,configure的参数如下 #./configure  --p 阅读详情

相关推荐

linux下.so动态库的生成、编译、调用

Linux下的.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件。   第一个gcc编译的so及调用示例: plus.c代码: #include int plus(int a,int b) {   int x=a*a+b*b;  return x; } link.h代码: #include int plus(); use.c代码: #inc

liujun213的专栏 1167

Linux下so动态库查看与运行时搜索路径的设置

ldd命令linux 下可以使用ldd查看可执行文件所需要的动态链接库(*.so)。 注:下文用so代替动态链接库文件。// 举个例子 ~$ ldd /bin/ls linux-vdso.so.1 => (0x00007ffe06386000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fd6

renwotao2009的专栏 5万+

C++文件如何在linux下生成动态库So,以及如何使用这个动态库

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

1万+

linux-vdso.so.1介绍

linux-vdso.so.1介绍

weixin_39094034的博客 3562

别再死磕公式了!用Python+NumPy手把手实现机器人逆运动学数值求解(附避坑指南)

本文详细介绍了如何使用Python和NumPy实现机器人逆运动学(Inverse Kinematics, IK)的数值求解方法,包括牛顿-拉弗森法、雅可比矩阵计算及奇异位形处理。通过实战代码和避坑指南,帮助开发者快速掌握现代机器人学中的核心算法,提升工程实践能力。

weixin_30687051的博客 126

UFS 功能描述:UFS boot

UFS 启动过程介绍:启动配置,启动代码下载过程和安全性

m0_51720747的博客 1601

动态库路径问题及无法成功链接问题

动态库相关问题

jggcicky的博客 3817

kettle信息发送钉钉

由于其他的作业比较多,想要在job中加入一个转化发送消息到钉钉,其他的配置说明直接获取系统的信息。这样也避免直接修改其他的转换和大量的工作量。 步骤: 1、新建一个转换 拉取获取系统信息、获取变量、JavaScript代码、获取access_token组件。 2、获取系统信息设置 拿到需要的信息,比如作业的读写更新删除行数,job的日志内容 这个日志内容同在作业执行页面下输出的日志,所以可以在执行作业时选择是详细日志、基本日志还是错误日志。 3、获取变量 获取变量主要是想要去拿到job的名称,文件名。按

Deng_7788的博客 1445

Linux系统中的内存划分-- VM split

内核内部,尤其是关于内存管理,是一个庞大而复杂的内容,可以说花上一辈子时间来研究内核中内存管理部分都不夸张。

zyqash的博客 1259

光耦选型避坑指南:如何根据CTR参数精准计算输入输出电阻(附24V工业场景实例)

本文深入解析光耦选型核心,聚焦电流传输比(CTR)参数及其衰减特性,提供从输出需求反向推导输入输出电阻的精准计算方法。文章以24V工业场景为例,结合光电耦合器数据手册,详细阐述了如何根据CTR最小值进行降额设计,并给出包含反接保护、TVS管等在内的完整保护电路方案,旨在构建高可靠、长寿命的信号隔离电路,避免因选型或设计不当导致的系统故障。

nept的博客 1038

Field Characteristics 深入解析,理解 SAP ABAP Analytics 中 Dimension 与 Measure 的真正边界

在SAP ABAP Analytics数据模型中,字段应建模为Dimension还是Measure,关键在于业务语义而非数据类型。Dimension提供分析上下文,构成数据坐标系,支持钻取与切片;Measure则需具备明确聚合语义(如#SUM、#MIN、#MAX),且必须满足Distinct(无重复)与Complete(无缺失)原则,确保聚合结果准确。错误的建模会导致聚合偏差,根源常在事实粒度不清或关联关系不当。因此,正确划分字段角色,本质是让Analytical Engine准确理解业务数据的分析逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 56

Linux VDSO

Linux VDSO

xiaozhi 922

EUV光源技术路线深度解析

EUV光刻技术的关键瓶颈在于13.5纳米光源的稳定高效获取。主流技术路线从DPP放电等离子体发展为LPP激光等离子体方案,后者通过激光轰击锡液滴实现更高功率输出。新出现的LDP技术综合激光预热与放电优势,虽功率扩展性有限,但为光源技术提供了有益补充。目前LPP仍是唯一通过量产验证的方案,而LDP可能作为过渡技术应用于特定场景。EUV光源的发展实质是能量转化效率与系统可靠性的持续优化过程,各种技术路线的探索共同推动着这一核心工艺的进步。

硬核科技 556

linux如何加载系统so,Linux编程练习(二)—— Linux下.so动态库的建立和调用

(在Ubuntu 12.04系统下进行测试)实现将一个自己编写的Hello.c文件打包成libHello.so动态库,并通过gcc编译工具实现用一个test.c程序调用libHello.so和自定义头文件Hello.h的过程。具体程序代码如下://Hello.h文件include void printhello();//Hello.c文件#include void printhello(){put...

weixin_39828102的博客 339

使用python中pypower进行电力潮流计算

使用python中pypower进行电力潮流计算

总裁余(余登武)博客 4860

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5548

基于海康windows下的.dll和Linux下的.so动态库调用

基于海康windows下的.dll和Linux下的.so动态库调用 上一篇:基于海康SDK开发文档分析+云台控制实现+经典案例 最近在做海康摄像头的二次开发,在将项目部署在Linux上面的时候遇到了调用动态库的问题,下面只解释怎样去调用 一、windoes和Linux下调用动态库 windows下支持的动态库为以.dll结尾的(还有其他的) 而Linux下是不支持的,Linux下支持的动态库为....

@°的博客 3346

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

aarch64-linux-gcc安装编译及生成so动态库和调用

并直接选择带有二进制的文件,即在官网入口处选择 binaries 路径,该文件夹下面包含各种版本的已经编译好的 aarch64-linux-gnu-gcc 二进制可执行程序。部分转自:https://blog.csdn.net/m0_54850825/article/details/124487551。部分转自:https://blog.csdn.net/qq_42939980/article/details/124150004。x86_64 代表宿主机是64位的,其他的则都为32位的。

weixin_47685129的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Linux下.so动态库的建立和调用

我在这里介绍如何在环境中创建共享库 (shared library)。共享库以so为后缀(shared object)。共享库与Windows下的DLL类似,是在程序运行时动态连接。多个进程可以连接同一个共享库。 实现将一个自己编写的Hello.c文件打包成libHello.so动态库,并通过gcc编译工具实现用一个test.c程序调用libHello.so和自定义头文件Hello.h的过程。 具体程序代码如下: //Hello.h文件 #include <stdio.h> void print

墨染锦年的博客 1291

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

QT Windows和Linux下,Qt Creator创建动态库和调用动态库(.dll 和 .so)

简述 Windows下动态链接库是.dll文件,静态链接库文件是.lib文件。Linux下动态库是.so文件。 Qt嵌套在visual studio时,编译器是MSVC,而Qt Creator的编译器是MinGW,针对MSVC和MinGW这两种编译器,作个简单的介绍: MSVC是指微软的VC编译器。 MinGW是指是Minimalist GNU on Windows的缩写。它是一个可自由使...

qq_27278957的博客 8309

【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序

方法一:添加环境变量 子招数1. 添加当前用户当前终端的环境变量-临时 export LD_LIBRARY_PATH=/home/czd/... #.so file path 子招数2. 添加当前用户的环境变量 修改~/.bashrc文件,在其末尾,添加环境变量 vim ~/.bashrc export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/czd/... #.so file path 使其生效, source ~/.bashrc 如不能生

我的笔记本 1万+

Linux 调用动态库(.SO文件)总结

像window调用库文件一样,在linux下,也有相应的API因为加载库文件而存在。它们主要是以下几个函数: 函数名 功能描述 dlopen 打开对象文件,使其可被程序访问 dlsym 获取执行了dlopen函数的对象文件中的函数的地址 dlerror 该函数没有参数,它会在发生前面的错误时返回一个字符串,同时将其从内存 中清空; 在没有错误发生时返回 NULL, dlclose 关闭目标文件。如果无需再调用共享对象的话,应..

ayang1986的专栏 1万+

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

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

1万+

linux 调用动态库so文件

关于动态调用动态库方法说明 一、        动态库概述 1、  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数)。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行链接,这样就不必在每次开发程序时都对这些通用的函数进

nodeathphoenix的专栏 4万+

C++ linux动态库so导出及使用

C++ linux动态库so导出log4cpp linux下编译安装使用宏定义进行区分windows & linux存在不兼容的函数sprint_s snprintf控制linux动态库的导出函数 第一次尝试导出linux动态库,遇到的问题做个记录。 log4cpp linux下编译安装 在官网上下下来包过后,官网的安装说明不全: ./autogen.sh ./configure mak...

fantasysolo的博客 1万+

java 通过jni调用linux so动态库

java 通过jni调用linux so动态库java 通过jni调用linux so动态库准备开发javaC++总结 java 通过jni调用linux so动态库 最近有个项目需要java调用C++的动态库,所以重温一下操作步骤记录一下。 准备 使用环境intellij idea clion 系统环境centos: 平时开发使用开发环境是windows 所以部署到linux 上面 调试起来...

灰太狼的博客 5514
上一篇: Linux编程练习(一)—— 多线程+共享内存+线程信号量练习
下一篇: codeblocks搭建opencv完整教程(一)
GooMaple
博客等级 码龄14年 79粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值