首页 > 其他分享 >28_库的制作与使用

28_库的制作与使用

时间:2024-04-10 20:00:24浏览次数:12  
标签:文件 mylib lib void 28 编译 使用 动态 制作

库的制作与使用

介绍

​ 库是一种可执行的二进制文件, 是编译好的代码。 使用库可以提高开发效率。 在 Linux 下有静态库和动态库。 因此编译出来的体积就比较大。
​ 静态库在程序编译的时候会被链接到目标代码里面。 所以程序在运行的时候不再需要静态库了。 因此编译出来的体积就比较大。 以 lib 开头, 以.a 结尾
​ 动态库(动态库也叫共享库) 在程序编译的时候不会被链接到目标代码里面, 而是在程序运行的时候被载入的。 所以程序在运行的时候需要动态库了。 因此编译出来的体积就比较小。 以 lib 开头, 以.so 结尾。

静态库的制作步骤:

​ 1 编写或准备库的源代码
​ 2 将源码.c 文件编译生成.o 文件
​ 3 使用 ar 命令创建静态库
​ 4 测试库文件

实验: 静态库的制作

新建 mylib.c 文件, 编辑内容如下所示:

#include<stdio.h>
void mylib(void);
void mylib(void)
{
	printf("This is mylib\n");
}	

image-20240404185429613

cr是创建和覆盖的意思

lib开头.a结尾

libmylib.a: 库文件名

mylib: 库名

使用这个静态库

test.c

#include<stdio.h>

void mylib();

int main(int argc, char const *argv[])
{
    mylib();
    return 0;
}

image-20240404224758176

-l+去掉lib前缀和.a后缀的库名

-L+该库文件名所在的路径

动态库制作步骤:

​ 1 编写或准备库的源代码
​ 2 将源码.c 文件编译生成.o 文件
​ 3 使用 gcc 命令创建动态库
​ 4 测试库文件
新建 mylib.c 文件, 编辑内容如下所示:

#include<stdio.h>
void mylib(void);
void mylib(void)
{
	printf("This is mylib\n");
}

image-20240404225110035

-fpic: 生成位置无关的代码(产生的代码中,没有绝对地址,全部使用相对地址)

-shared: 生成动态库

test.c

#include <stdio.h>
void mylib(void);
int main(void)
{
	mylib();
	return 0;
}

image-20240404225149360

image-20240404225153648

​ 在动态库使用是, 系统会默认去/lib, /usr/lib 目录下去查找动态函数库, 如果我们使用的库不在里面,
就会提示错误。 解决这个问题有三种方法。

解决方法:

第一种方法:
将生成的动态库拷贝到/lib 或者/usr/lib 里面去, 因为系统会默认去这俩个路径下寻找。
第二种方法:
把我们的动态库所在的路径加到环境变量里面去, 比如我们动态库所在的路径为/home/test, 我们就可以这样添加, 但是这种方法只在当前设置的窗口有效。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/samba/linux/13

我们加入环境后, 运行 a.out,如下图所示:

image-20240404230152099

只对当前命令窗口有效

第三种方法:
修改 ubuntu 下的配置文件/etc/ld.so.conf, 我们在这个配置文件里面加入动态库所在的位置, 然后使用命令 ldconfig 更新目录。
我们输入以下命令编辑/etc/ld.so.conf 文件, 如下图所示:

image-20240404231512852

image-20240404231423291

修改完文件保存退出, 输入 ldconfig 更新目录。 运行测试如下图所示:

image-20240404230313139

标签:文件,mylib,lib,void,28,编译,使用,动态,制作
From: https://www.cnblogs.com/mzx233/p/18127287

相关文章

  • Git使用:大体积的历史commit无法推送到远程仓库的解决方案
    0介绍场景:把本地仓库全量推送到远程的空仓库,保留提交历史,所有分支,所有tag;大部分代码托管服务都会有免费推送的限制(如gitlab,Freepushlimit|GitLab,Accountandlimitsettings|GitLab),所以当提交中包含大于指定体积的commit时,会遇到如下的失败:如上的失败,可以通过git命令,......
  • 零基础到精通,Postman安装使用教程(一)
    postman的介绍和安装Postman的介绍Postman是一款谷歌开发的接口测试工具,使API的调试与测试更加便捷。它提供功能强大的WebAPI&HTTP请求调试。它能够发送任何类型的HTTP请求(GET,HEAD,POST,PUT..),附带任何数量的参数+headers。postman是一款支持http协议的接口调......
  • Qt使用Sqlite数据库-2
        上一篇文章介绍了sqlite数据库在Qt中基本使用方法(链接:Qt使用Sqlite数据库-1(入门级)-CSDN博客)。今天继续学习数据库常用的语法。1.删除数据库内容voiddeleteData(){QStringSql;//拼接sql语句Sql="DELETEFROMPerson_TableWHEREName='张......
  • 使用 Js 纯手写实现组件
    vue的单文件组件,其实最终是编译成了一个object,然后调用该object上的setup()函数来渲染页面的;如下两个页面,一个使用vue单文件组件的语法来实现,一个使用纯js来实现,二者效果一致使用vue实现组件src/views/VueImplementedView.vue<template><div><h1class="......
  • 【教学类-50-06】20240410“数一数”4类星号图片制作PDF学具
    作品展示:背景需求:前文遍历四个文件夹,分别将每个文件夹内的10个图片的左上角加入星号,显示难度系数【教学类-50-05】20240410“数一数”4类图片添加“难度星号”-CSDN博客文章浏览阅读55次,点赞2次,收藏2次。【教学类-50-05】20240410“数一数”4类图片添加“难度星号”https......
  • OpenCV与AI深度学习 | 实战 | 使用OpenCV确定对象的方向(附源码)
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:实战|使用OpenCV确定对象的方向(附源码)导读本文将介绍如何使用OpenCV确定对象的方向(即旋转角度,以度为单位)。 1先决条件   安装Python3.7或者更高版本。可以参考下文链接:    ......
  • windows 环境下使用脚本备份 oracle 数据库数据
    @echooffecho================================================echoWindows环境下Oracle数据库的自动备份脚本echo1.使用当前日期命名备份文件。echo2.自动删除7天前的备份。echo================================================echo以“YYYYMMDD”格......
  • 在c#中使用gRPC通讯
    参考:C#封装GRPC类库及调用简单实例-wtc87-博客园(cnblogs.com)包括:GRPC文件的创建生成、服务端和客户端函数类库的封装、创建服务端和客户端调用测试。创建并生成GRPC服务文件创建新项目控制台应用,项目名称(MgRPC)安装三个nuget包Google.Protobuf,Grpc.Core,......
  • vue中:key 的特殊使用
    1.常用的使用方法v-for 结合使用1<ul>2<liv-for="iteminitems":key="item.id">...</li>3</ul>唯一的key值在做虚拟DOM算法时尤为重要2.触发子组件并进行更新组件让其发生变化1<childrenComponentsv-model="files":key="uploadKey&q......
  • 使用微信小程序开发制作一个简单的微信小游戏
    微信小程序是一种基于微信平台的应用程序开发框架,开发者可以使用微信小程序开发工具进行开发,开发出来的小程序可以在微信中直接使用。微信小游戏是微信小程序的一种特殊类型,主要面向用户提供小型、简单的游戏体验。下面我将为您详细介绍如何使用微信小程序开发工具制作一个简单......