动态库.so如何使用

news/2025/1/24 16:36:23/文章来源:https://www.cnblogs.com/bai7/p/18689750

动态库(在 Linux 系统下通常以 .so 为扩展名,在 Windows 系统下以 .dll 为扩展名)的使用包含创建和在程序里调用这两个主要方面,以下将分别介绍在 Linux 和 Windows 系统中动态库的使用方法。

Linux 系统下动态库的使用

1. 创建动态库

假设有两个源文件 add.csubtract.c,它们分别实现加法和减法功能。

  • add.c
#include <stdio.h>int add(int a, int b) {return a + b;
}
  • subtract.c
#include <stdio.h>int subtract(int a, int b) {return a - b;
}

使用以下命令将这两个源文件编译成动态库 libmath.so

gcc -shared -fPIC add.c subtract.c -o libmath.so
  • -shared:表示生成共享库文件。
  • -fPIC:生成位置无关代码,这对于动态库是必需的。

2. 编写使用动态库的程序

创建一个主程序 main.c 来调用动态库中的函数:

#include <stdio.h>// 声明动态库中的函数
extern int add(int a, int b);
extern int subtract(int a, int b);int main() {int result_add = add(5, 3);int result_subtract = subtract(5, 3);printf("Add result: %d\n", result_add);printf("Subtract result: %d\n", result_subtract);return 0;
}

3. 编译主程序并链接动态库

gcc main.c -L. -lmath -o main
  • -L.:指定动态库的搜索路径为当前目录。
  • -lmath:指定要链接的动态库名为 libmath.so

4. 运行程序

在运行程序之前,需要让系统知道动态库的位置。有以下几种方法:

  • 临时设置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./main

LD_LIBRARY_PATH 是 Linux 系统用于指定动态库搜索路径的环境变量,上述命令将当前目录添加到该变量中。

  • 永久设置环境变量:可以将 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library 添加到 ~/.bashrc~/.bash_profile 文件中,然后执行 source ~/.bashrc 使设置生效。
  • 将动态库复制到系统默认搜索路径:例如 /usr/lib/usr/local/lib,不过这种方法需要管理员权限。

Windows 系统下动态库的使用

1. 创建动态库

同样使用上述的 add.csubtract.c 文件,使用 MinGW 或 Visual Studio 等工具来创建动态库。以下是使用 MinGW 的示例:

gcc -shared -o math.dll add.c subtract.c

2. 编写使用动态库的程序

创建 main.c 文件:

#include <stdio.h>
#include <windows.h>// 定义函数指针类型
typedef int (*AddFunction)(int, int);
typedef int (*SubtractFunction)(int, int);int main() {// 加载动态库HINSTANCE hDLL = LoadLibrary("math.dll");if (hDLL == NULL) {printf("Failed to load DLL.\n");return 1;}// 获取函数地址AddFunction add = (AddFunction)GetProcAddress(hDLL, "add");SubtractFunction subtract = (SubtractFunction)GetProcAddress(hDLL, "subtract");if (add == NULL || subtract == NULL) {printf("Failed to get function address.\n");FreeLibrary(hDLL);return 1;}// 调用函数int result_add = add(5, 3);int result_subtract = subtract(5, 3);printf("Add result: %d\n", result_add);printf("Subtract result: %d\n", result_subtract);// 释放动态库FreeLibrary(hDLL);return 0;
}

3. 编译和运行程序

使用 MinGW 编译:

gcc main.c -o main

math.dllmain.exe 放在同一目录下,然后运行 main.exe

通过以上步骤,你可以在 Linux 和 Windows 系统中创建并使用动态库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874784.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AQS学习笔记

一、使线程进入等待状态和唤醒状态的三种方法 1、使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程,需配合synchronized关键字使用 2、使用JUC包中的Condition的await()方法让线程等待,使用signal()方法唤醒线程 3、LockSupport类可以阻塞当前线程以…

Oracle安装指南 Xming远程桌面

安装Xming然后使用Oracle用户连接登录,设置DISPLAY环境变量(IP地址为你的windows客户端IP地址) export DISPLAY=192.168.111.155:0.0然后执行dbca就会弹出数据库配置界面了参考链接:https://www.cnblogs.com/iancloud/p/15015683.html

P4070 [SDOI2016] 生成魔咒

P4070 [SDOI2016] 生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 \(1,2\) 拼凑起来形成一个魔咒串 \([1,2]\)。 一个魔咒串 \(S\) 的非空字串被称为魔咒串 \(S\) 的生成魔咒。 例如 \(S=[1,2,1]\) 时,它的生成魔咒有 \([1],[2],[1…

深入探讨触发器的创建与应用:数据库自动化管理的强大工具

title: 深入探讨触发器的创建与应用:数据库自动化管理的强大工具 date: 2025/1/24 updated: 2025/1/24 author: cmdragon excerpt: 触发器是一种强大的数据库对象,它能够在特定事件发生之前或之后自动执行一组SQL语句。作为一种自动化管理工具,触发器在许多数据库管理场景…

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Jan 22, 2025 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

VS.net中快捷键收缩和展开代码段

i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M 折叠或展开当前方法 iv. Ctrl-M-L展开所有方法 其他的快捷方式:怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 双击状态栏中的行号2.. 怎样创建矩形选区? 两…

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…

Vmware 虚拟机克隆注意事项-CentOS7

1.克隆后修改MAC地 2.修改 UUID,UUID克隆虚拟机后一般是一样的,需要进行修改 输入命令uuidgen,将生成的UUID写入ifcfg-ens33 【文件位置:/etc/sysconfig/network-scripts/ifcfg-ens33】 【我克隆的时候并没有修改,但是也一样可以联网,不知道为啥】 3.修改主机名 先临时修…

autocad Ribbon创建的一种新思路

之前开发的功能相对简单, 一个RibbonTab就把相关的功能展示出来了。 目前着手准备开发的功能, 需要多个RibbonTab, 且不想显示AutoCAD或Civil 3D自身的RibbonTab, 曾经想模拟3d3s的样子来切换RibbonTab, 但发现3d3s是将AutoCAD原生的Cuix和自己的RibbonTab结合到一起, 对…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关):提供服务路由能力 提供各种拦截支持1、分布式网关推荐 建议使用专业的分布…

Mac安装Prometheus + Grafana

一、安装Prometheus 1、下载安装 brew install prometheus2、安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3、修改配置文件 默认配置文件路径:/opt/homebrew/etc/prometheus.yml global:scrape_interval: 15sscrape_configs:- job_name: "prometheus"static_co…

Python基础6——装饰器(续) 递归 模块

1.函数1.1 参数当默认参数的值为可变类型时慎用# 不推荐使用以下代码 def func(data, value=[]):pass可以将默认参数的值改为None# 推荐使用以下代码 def func(data, value=None):if not value:value = []案例def func(data, value=[]):value.append(data)return valuev1 = fun…