当前位置: 首页 > news >正文

linux 环境下动态链接库试验

1.概要

2.代码

2.1 main.c

#include <stdio.h>
#include "lib1.h"int main(){printf("hello word\n");int a = add(2,3);printf("%d\n",a);return 0;
}

2.2 lib1.c

#include "lib1.h" int add(int a,int b){return a+b;
}

2.3 lib1.h 

#ifndef MYLIB_H  
#define MYLIB_H  int add(int a, int b);  #endif //MYLIB_H

3.运行结果

3.1 编译类库结果

gcc -shared -o lib1.so lib1.c

3.2 运行主函数的结果

xjc@US-PF20F37R:~/objects/tests/t12$ gcc -o main main.c -L/home/xjc/objects/tests/t12 -l1
xjc@US-PF20F37R:~/objects/tests/t12$ export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
xjc@US-PF20F37R:~/objects/tests/t12$ ./main
hello word
5
xjc@US-PF20F37R:~/objects/tests/t12$ 

4.附加

 4.1 c 编译动态链接库

在C语言中,你可以创建一个动态链接库(也称为共享库),这允许你在多个程序之间共享代码。以下是在Unix-like系统(如Linux或macOS)上使用GCC编译器创建动态链接库的基本步骤:

  1. 编写源代码

首先,你需要编写你的C源代码。例如,我们创建一个简单的函数,该函数接受两个整数参数并返回它们的和。将此代码保存为mylib.c

#include "mylib.h"
int add(int a, int b) {
return a + b;
}

同时,你需要一个头文件(例如mylib.h)来声明这个函数:

#ifndef MYLIB_H
#define MYLIB_H
int add(int a, int b);
#endif //MYLIB_H
  1. 编译为动态链接库

使用GCC编译器,你可以通过以下命令将源代码编译为动态链接库:

gcc -shared -o libmylib.so mylib.c

这里,-shared选项告诉GCC你要创建一个共享库,-o libmylib.so指定输出文件的名称(在这种情况下是libmylib.so)。你可以根据需要更改这个名称。
3. 使用动态链接库

一旦你有了动态链接库,你就可以在其他C程序中使用它。为此,你需要在编译时包含库,并在运行时确保库在系统的库路径中或指定库的路径。

例如,如果你有一个名为main.c的程序,它使用了你的库中的函数,你可以这样编译它:

gcc -o main main.c -L. -lmylib

在这里,-L.告诉GCC在当前目录中查找库,-lmylib指定要链接的库(注意,-l选项后面的库名应去掉前面的lib和后缀.so)。
4. 运行程序

在运行程序之前,确保动态链接库在系统的库路径中,或者你可以通过设置LD_LIBRARY_PATH环境变量来指定库的路径。例如:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main

这将把当前目录添加到库路径中,然后你可以运行你的程序。

请注意,上述步骤是针对Unix-like系统的。如果你在Windows上,过程会有所不同,特别是库的命名和编译选项。在Windows上,你可能会使用.dll作为动态链接库的后缀,并使用不同的编译器选项来创建它们。

2. c 如何使用自定义的动态链接库

在C语言中,使用自定义的动态链接库(也称为共享库)涉及几个步骤。这里是一个基本的指南,展示了如何在Unix-like系统(如Linux或macOS)上创建和使用自定义的动态链接库。

1. 编写源代码

首先,你需要编写库的源代码和头文件。

mylib.h(头文件):

#ifndef MYLIB_H
#define MYLIB_H
int add(int a, int b);
#endif //MYLIB_H

mylib.c(源文件):

#include "mylib.h"
int add(int a, int b) {
return a + b;
}

2. 编译动态链接库

使用GCC编译器将源代码编译为动态链接库。

gcc -shared -o libmylib.so mylib.c

3. 编写使用库的程序

现在,你可以编写一个C程序来使用这个库。

main.c(使用库的程序):

#include <stdio.h>
#include "mylib.h"
int main() {
int sum = add(2, 3);
printf("The sum is: %d\n", sum);
return 0;
}

4. 编译并链接到动态链接库

编译你的程序时,需要链接到你的动态链接库。你需要告诉编译器在哪里找到库文件(使用-L选项),以及要链接的库名(使用-l选项,注意去掉lib前缀和.so后缀)。

gcc -o main main.c -L. -lmylib

这里,-L.告诉编译器在当前目录中查找库。

5. 运行程序

在运行程序之前,你需要确保动态链接库在系统的库路径中,或者你可以通过设置LD_LIBRARY_PATH环境变量来指定库的路径。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main

这里,:$LD_LIBRARY_PATH确保你不会覆盖现有的库路径。

如果你不想设置LD_LIBRARY_PATH,你可以将库文件复制到系统的标准库路径中,如/usr/local/lib(可能需要root权限)。或者,你可以在编译时使用-Wl,-rpath选项来指定运行时库的搜索路径。

6. 清理

在开发过程中,你可能想要清理生成的文件。你可以使用make工具或简单地使用rm命令来删除它们。

rm -f libmylib.so main

然后,你可以重新编译和链接你的库和程序。

相关文章:

  • YOLOv8改进 | 注意力机制 | 添加混合局部通道注意力——MLCA【原理讲解】
  • KafkaQ - 好用的 Kafka Linux 命令行可视化工具
  • vue.js+node.js+mysql在线聊天室源码
  • 006 CentOS 7.9 elasticsearch7.10.0安装及配置
  • 使用adb通过wifi连接手机
  • flask返回的数据怎么是转义后的字符串啊
  • Android framework的Zygote源码分析
  • 一步一步用numpy实现神经网络各种层
  • 云顶之弈-测试报告
  • 【数组】【快慢双指针】删除有序数组中的重复项+移除元素+删除有序数组中的重复项II
  • LabVIEW水箱液位控制系统
  • 使用python完成一个定时从版本库下载daily版本
  • Clearview AI使用了你的脸。现在你可以获得公司的股份了。
  • SECS/GEM 底层协议解析
  • 一篇文章教你学会如何用云服务器搭建https网站
  • 《剑指offer》分解让复杂问题更简单
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Date型的使用
  • ES10 特性的完整指南
  • LintCode 31. partitionArray 数组划分
  • mongodb--安装和初步使用教程
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • scala基础语法(二)
  • TCP拥塞控制
  • Vue2.x学习三:事件处理生命周期钩子
  • 闭包,sync使用细节
  • 从tcpdump抓包看TCP/IP协议
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 前端之React实战:创建跨平台的项目架构
  • 实战|智能家居行业移动应用性能分析
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 原生Ajax
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • $$$$GB2312-80区位编码表$$$$
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (27)4.8 习题课
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (汇总)os模块以及shutil模块对文件的操作
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)大型网站的系统架构
  • (转)德国人的记事本
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 无限分类
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @RestControllerAdvice异常统一处理类失效原因
  • [10] CUDA程序性能的提升 与 流