C语言调用so动态库的两种方式

2023-05-16

方式1:类似静态库的调用(使用头文件)

这种方式生成的程序会在启动时候就加载so动态库。

add.h

int add(int x, int y);

add.c

#include "add.h"

int add(int x, int y) {
    return (x + y);
}

main.c

#include <stdio.h>
#include "add.h"

int main()
{
    int sum = add(7, 8);
    printf("7+8 = %d\n", sum);

    return 0;
}

编译so,生成libadd.so。

gcc -shared -o libadd.so add.c

编译main,使用-L./指定add库在当前目录。

gcc -o main main.c -L./ -ladd

方式2:使用dlopen/dlsum动态加载动态库(不使用头文件)

这种方式生成的程序会在代码执行到指定行位置加载so动态库。

add.c

int add(int x, int y) {
    return (x + y);
}

main.c

#include <stdio.h>
#include <dlfcn.h>

int main()
{
    /*手动加载指定位置的so动态库*/
    void* handle = dlopen("./libadd.so", RTLD_LAZY);
    int (*add)(int a, int b);

    /*根据动态链接库操作句柄与符号,返回符号对应的地址*/
    add = dlsym(handle, "add");

    int sum = add(7, 8);
    printf("7+8 = %d\n", sum);

    dlclose(handle);
    return 0;
}

编译so,生成libadd.so

gcc -shared -o libadd.so add.c

编译main,不需要指定libadd.so相关信息进行编译,执行时候会在指定目录加载so

gcc -o main main.c -ldl

两种调用方式总结

方式1使用头文件,所以可以直接调用头文件声明的函数。编译的时候指定了动态库位置和名称,程序启动时候系统就会自动加载相应位置的so动态库。
方式2没有头文件,编译的时候也不需要指定动态库信息。但是需要在程序中使用dlopen函数加载相应位置的so动态库,且要使用dlsym函数根据函数符号去查找此函数的地址。


BONUS: so动态库中调用so动态库

add.h

int add(int x, int y);

add.c

#include "add.h"

int add(int x, int y) {
    return (x + y);
}

sum.h

void printsum(int a, int b);

sum.c

#include "sum.h"
#include <stdio.h>
#include "add.h"

void printsum(int a, int b){
    int sum = add(a, b);
    printf("%d+%d = %d\n", a, b, sum);
}

main.c

#include "sum.h"

int main()
{
    printsum(1, 3);
    return 0;
}

编译libadd.so

gcc -shared -o libadd.so add.c

编译libsum.so,需要指定libadd.so信息

gcc -shared -o libsum.so sum.c -L. -ladd

编译main,仅需要指定libsum.so

gcc -o main main.c -L. -lsum

main运行的时候同时需要libsum.so 和 linadd.so。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言调用so动态库的两种方式 的相关文章

  • STM32F4 SPI RX/TX DMA 读写FLASH数据

    STM32 使用DMA读写FLASH数据需要注意以下几点 xff1a 1 SPI全双工模式下 xff0c 无论读写FLASH数据均需要同时使能RX TX DMA 2 写数据时回读数据应当丢弃 xff0c 读数据时应当发送0xff来启动SPI
  • C++ vector的用法总结(整理)

    vector 是向量类型 xff0c 它可以容纳许多类型的数据 xff0c 如若干个整数 xff0c 所以称其为容器 它相当于一个动态的数组 当程序员无法知道自己需要的数组的规模多大时 用其来解决问题可以达到最大节约空间的目的 vector
  • 【问题已解决】无法定位程序输入点XXX于动态链接库xxxxxx

    因为刚接触OSG需要用CMake进行编译 xff0c 在操作上的问题还可以适应 xff0c 主要是电脑环境的影响比较大 编译成功后 xff0c 运行程序提示缺少一些dll文件 这里的主要处理办法是下载缺失的部分 xff0c 加到对应的文件夹
  • [python]重新安装pip

    目录 pip简介 一 恢复easy install文件 二 安装pip pip简介 python中一开始的import指令大家都不陌生 xff0c 也是因为可以调用不同模块的功能 xff0c 被称为 胶水语言 一般安装外部库有很多种方式 x
  • 【ROS2 入门】Jeston TX1 JetPack_4.6.3环境 ubuntu 18.04 ROS2 安装

    大家好 xff0c 我是虎哥 xff0c 从今天开始 xff0c 我将花一段时间 xff0c 开始将自己从ROS1切换到ROS2 xff0c 在上一篇中 xff0c 我们再虚拟机环境中安装了 ROS2 eloquent版本 xff0c 并完
  • 【已解决】拯救者Y7000不能调节亮度

    在上午的时候 xff0c 电脑突然有一些进程失控 xff0c 在任务管理器中一些服务关不掉 xff0c 电脑接近死机 xff0c 只能重启来解决 但是重启之后电脑突然很暗 回顾今天发生的情况 xff0c 应该是软件的锅了 应该是因为该型号的
  • 【已解决】win10 “你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。

    在访问局域网共享盘的时候 xff0c 突然出现报错 通过强大的网友 xff0c 通过改变组策略权限可以解决 1 按下win 43 R xff0c 输入gpedit msc 2 打开 管理模板 gt 网络 gt Lanman工作站 gt 启动
  • 【已解决】win10离线安装.net framework 3.5(错误:0x8024402c)

    首先说一下问题的背景 xff0c PC是离线环境win10系统 xff0c 主要在在离线安装VS2008的时候需要先安装这个低版本 Net 网上有很多方式 xff0c 这次参考价值最大的是这两个 Win10离线安装 net framewor
  • 【已解决可更新】VS2008 写入位置 0xCDCDCDCD 时发生访问冲突

    这个问题分两个小问题来细说 问题的背景是VS2008项目中封装了网络协议接口类 xff0c 对象成员有一个SOCKET类型成员变量和封装的进行三次握手的成员函数 在调用成员函数时报错发生访问冲突 1 写入位置 0xCDCDCDCD 时发生访
  • 【python】删除python代码中的简单注释

    可以当作一个简单的小工具来使用 xff0c 不过也是比较有局限性 xff0c 只能去掉 开头的注释行 使用内置函数 xff0c 没有引入模块 filename 61 34 xxx txt 34 打开名为xxx的txt文件 file 61 o
  • 再见2022,加油2023

    其实变化最大的一点就是 xff0c 这一年自己变成了一个北漂 没有很多的成熟的规划 xff0c 没有很多预算准备来到了北京 那会儿和之前的同事合租 xff0c 也给他添了不少麻烦 最开始到北京的时候 xff0c 因为口罩问题入职前生活状态比
  • 有效解决“SyntaxError: Non-UTF-8 code starting with” 语法错误

    在程序中出现中文的时候会有这种报错 xff0c 在代码的第一行加一句注释 xff0c 说明一下字符类型可以解决 coding 61 gbk coding utf 8这两种在我的程序里是亲测有效的
  • STM32F407定时器编码器接口模式

    STM32F407定时器编码器接口模式 16位定时器扩展32位 span class token comment TIM5初始化为编码器接口模式 xff0c 读取光栅尺数值 span span class token keyword voi
  • STM32F407的USB_HID 基础配置STM32CubeMX

    STM32F407的USB HID 基础配置 示例详解 参考 xff1a https blog csdn net zhanglifu3601881 article details 89675307 工具 xff1a STM32CubeMX5
  • STM32F407通过FSMC连接W5100S进行TCP网络通信

    STM32F407通过FSMC连接W5100S进行TCP网络通信 一 W5100S硬件 1 HS NM5100SA模块 模块厂家 xff1a 成都浩然电子http www hschip com HS NM5100SA以太网络控制器接口模块是
  • 【ROS2 入门】ROS2 创建工作空间

    大家好 xff0c 我是虎哥 xff0c 从今天开始 xff0c 我将花一段时间 xff0c 开始将自己从ROS1切换到ROS2 xff0c 在上几篇中 xff0c 我们一起了解ROS 2中很多基础概念 xff0c 从今天开始我们逐步就开始
  • STM32F407通过SPI连接W5100S进行TCP网络通信

    STM32F407通过SPI连接W5100S进行网络通信 一 W5100S硬件 1 HS NM5100SA模块 模块厂家 xff1a 成都浩然电子http www hschip com HS NM5100SA以太网络控制器接口模块是将W51
  • STM32F407 内部自带FLASH 模拟 EEPROM

    STM32F407 内部自带FLASH 模拟 EEPROM 一 STM32F407自带FLASH STM32F4 本身没有自带 EEPROM xff0c 但是 STM32F4 具有 IAP xff08 在应用编程 xff09 功能 xff0
  • 国标GB/T 18384.1 绝缘检测算法 推导公式

    国标GB T 18384 1 绝缘检测算法 推导公式 国标中关于绝缘检测算法只有结果 xff0c 没有推导公式 xff0c 如下 xff1a 根据电流回路相等原则 xff0c 推导出公式1 xff1a V1 V1 为正常情况下电池正负极电压
  • LTC6820和isoSPI使用笔记

    一 LTC6820使用笔记 1 MSTR主控 受控 MSTR 引脚 11 引脚 12 xff1a 串行接口主 从选择器输入 位于隔离式接口的主控器侧 xff08 SPI主机 xff09 xff0c 引脚接 VDD 位于隔离式接口的受控器侧

随机推荐

  • ESP8266学习笔记1--硬件

    1 ESP12F模块 原理图 自制开发板 原理图
  • ESP8266学习笔记2--Arduino环境搭建

    1 安装Arduino IDE https www arduino cn thread 5838 1 1 html 2 安装esp8266扩展 https www arduino cn thread 76029 1 1 html 安装成功后
  • ESP8266学习笔记3-闪存文件系统

    3 3 1 闪存文件SPIFFS基本操作 程序来源 xff1a 太极创客http www taichi maker com homepage esp8266 nodemcu iot iot c spiffs spiffs operation
  • 同一寄存器不同位域赋值的两种方法

    当一个寄存器有不同位域时 xff0c 我们需要给不同位域赋值 如何赋值方便呢 xff1f 下面有两种方法 xff0c 总结一下 个人觉得位域写法更简洁 整体寄存器法 typedef struct StrNa uint32 t reg1 re
  • mavlink解析

    之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本系列共三篇 xff0c 这是第一篇 本文大概总结了下对mavlink协议的理解 以下如不说明都是说mavlink v1 0版本 首先附上mavlink的各个消息的简
  • Tomcat部署及优化

    目录 1 Tomcat概述 1 Tomcat的概念 2 Tomcat的核心组件 3 Java Servlet 的概念 4 JSP的概念 5 Tomcat中最顶层的容器 server 6 四个子容器的作用 7 Tomcat请求过程 2 Tom
  • STC89C52系列单片机内部资源——串口通信

    计算机通信是将计算机技术和通信技术的相结合 xff0c 完成计算机与外部设备或计算机与计算机之间的信息交换 可以分为两大类 xff1a 并行通信与串行通信 并行通信通常是将数据字节的各位用多条数据线同时进行传送 并行通信控制简单 传输速度快
  • 用TCP/UDP 网络调试助手(PC版)无法获取网页信息

    以前的网页均是http开头的 xff0c 是没有加密的 xff0c 以前用GET就能获取网页的信息 xff0c 但是现在的基本是https开头的 xff0c 是加密的 xff0c 所以现在用以前的方法 xff0c 只能返回301错误 现在想
  • Ubuntu 20.04安装Ros Noetic及Ubuntu 18.04安装ROS Melodic(两版本详细填坑)

    Ubuntu 20 04安装Ros Noetic及18 04安装ROS Melodic 表1 1 ROS的历史版本 1 设置安装源2 添加秘钥3 更新列表4 开始安装5 配置ROS环境变量6 安装rosinstall6 1 初始化核心组件r
  • linux 根文件系统,根设备,sys_open, sys_read, sys_write, sys_mount, sys_mknod

    笔者语 xff1a 1 内容涉及比较多 xff0c 自己也没有分章节 xff0c 因为觉得这些内容关联性很强 xff0c 自己也懒的去弄了 2 本文涉及以下内容 xff1a 2 1 内核启动过程中 xff0c 第一个文件系统为rootfs
  • uboot的配置(make xxx_config)和编译(make)工程解读

    uboot编译三步走 make xxx configmakemake install 第一步make xxx config 这一步是产生板子的配置文件 我们假设是配置ast2500evb板子 xff0c 那么这里的配置命令就是 make a
  • uboot启动之第一次运行C函数到uboot重定位

    接上一篇博文 uboot启动流程之上电启动到第一次准备好C语言运行环境 xff0c 本文从board init f 开始 board init f定义在uboot common board f c中 CONFIG SYS GENERIC B
  • pci总线扫描及pci网卡驱动

    本文讲述的基于intel 总线架构的硬件架构为例来说明linux是如何扫描总线上的PCI设备 CPU通过前端总线FS连接到北桥芯片North Bridge Chip 又称host Bridge 北桥芯片本身也是PCI总线0上的PCI设备 北
  • k8s下POD之间的通信过程

    本文主要描述同一个node之内的pod之间的通信 xff0c 以及不同node之间的pod之间的通信 同一个 node 上的不同 pod 之间的通信 xff1a 假设上图的POD A要和POD B 通信 POD A 发送一个包 xff0c
  • bash: ./<one_executable_file>: no such file or directory

    关于这个问题 xff0c 原因很多 但大部分的资料都是说PATH环境变量坏掉了 xff0c 或者 etc profile坏掉了 但其实 xff0c 还有一种原因 xff0c 就是你的可执行程序 lt one executable file
  • linux下动态库so的debug方式

    1 查看哪些进程使用了特定的动态库so lsof lib arm linux gnueabi libselinux so 1 COMMAND PID USER FD TYPE DEVICE SIZE OFF NODE NAME init 1
  • linux usb gadget driver代码

    本文基于linux 5 4 124 aspeed 2600 BMC 的代码实现来描述arm结构下的gadget driver 在读之前 xff0c 我们需要了解什么是usb gadget driver xff0c 以及它的作用 从英文字面上
  • 【毕业设计】深度学习社交安全距离检测系统 - python opencv

    文章目录 0 前言1 课题背景2 实现效果3 相关技术3 1 YOLOV43 2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 x1f525 Hi xff0c 大家好 xff0c 这里是丹成学长的毕设系列文章 xff01 x1
  • 关于进程和线程对于全局变量共享的问题学习总结

    进程和线程的共享 本文档可以说明以下几个问题 xff1a 问题一 xff1a 多进程编程中 xff0c 不同进程是否可以通过全局变量来通信 问题二 xff1a 多线程编程中 xff0c 不同线程是否可以通过全局变量来通信 xff1f 在说明
  • C语言调用so动态库的两种方式

    方式1 xff1a 类似静态库的调用 xff08 使用头文件 xff09 这种方式生成的程序会在启动时候就加载so动态库 add h span class hljs keyword int span add span class hljs