C语言——静态库和动态库的创建和使用

news2024/7/6 19:14:00

使用库函数是源码的一种保护

库函数其实不是新鲜的东西,我们一直都在用,比如C库。我们执行pringf() 这个函数的时候,就是调用C库的函数.

下面记录静态库和动态库的生成和使用.

静态库:libxxx.a

动态库:libxxx.so

静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的时候不需要外部函数库

动态库: 在程序运行的时候,将库加载到程序中,运行的时候需要外部函数库

函数库的目录有 /lib 和 /usr/lib 和 自定义

一. 静态库的生成和使用

下面通过一个简单的小栗子来介绍库函数怎么生成和使用.

1.库函数的源码 hello.c

#include "stdio.h"

int hello(void){

    printf("hello lib");  
  return 0;
}

#include "stdio.h"

int hello(void){

    printf("hello lib");  
  return 0;
}

2. 库函数的头文件 hello.h

#ifndef __HELLO_H
#define __HELLO_H

int hello(void);

#endif

库文件的头文件是库文件的目录,因为库文件是保护的,看不到里面的源码,所以把函数接口通过头文件来让人调用 .这样就实现了接口,也保护了源码

3.编译静态库函数

3.1 将 hello.c 编译成目标文件 生成  hello.o文件

gcc -c hello.c

3.2 将.o文件打包成静态库 生成 libhello.a库文件

ar -cr libhello.a hello.o

4 使用静态库,因为静态库是在编译的时候一起打包进程序的,所以如果编译的时候没有静态库文件,则无法编译

4.1 main.c 写一个main函数来调用库函数

#include "hello.h"    //引入库函数的头文件,这样才能找到函数声明

int main{
  
  hello();        //调用库函数

}

正常编译的时候是没办法通过的. 因为编译器找不到 hello() 的实现代码. 如图:

在这里插入图片描述

所以在编译的时候要加入库引用

gcc -c main -L. -lhello -o a.out  

-L<路径> 引用自定义库的路径,如果调用系统库就不用-L '.'表示当前文件夹

-lxxxx 这里libhello.a 只要写hello 就可以   //小写的L

4.2 直接可以执行,因为库函数已经被编译进去了

在这里插入图片描述
二.动态库的编译及使用

同样的hello.c 源码

1.生成.o文件

gcc -c -fpic hello.c //如果这里没有加-fpic 下一步就会提示你重新用 -fpic编译
  1. 编译成动态库
gcc -shared -fpic -o libhello.so hello.o

-shared 是生成动态库

-fpic 生成位置无关代码,默认加

在这里插入图片描述

3. 使用动态库 和静态库一样

gcc main.c -L. -lhello -o a.out

4. 执行 用动态库编译的程序没办法直接执行

在这里插入图片描述

在读取共享库libhello.so的时候出错,没有找到该文件

因为动态库程序会默认在 /lib 或者 /usr/lib的路径下寻找, 所以

解决的办法有3个:

1. 将.so 文件拷贝到 /usr/lib/文件夹下面

2.添加PATH环境变量

export LD_LIBRARY_PATH=<动态库所在的绝对路径>

3.修改配置脚本

将动态库所在的路径加到 /etc/ld.so.conf 文件里

添加后刷新

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity学习笔记】生命周期

文章目录 脚本的生命周期初始化更新顺序动画更新循环各类事件结束阶段 阶段分析协程返回 总结 官方文档&#xff1a;事件函数的执行顺序 脚本的生命周期 如图&#xff1a; 脚本的生命周期主要经历以下几个阶段&#xff1a; 初始化 初始化阶段&#xff0c;&#xff08;包括初…

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computer&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computer&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

1400*A. Factory

Examples input 1 5 output No input 3 6 output Yes 题意&#xff1a; a 和 m&#xff0c;a 不断加 a%m &#xff0c;如果 a 有一次能够被 m 整除&#xff0c;则打印 Yes&#xff0c;如果一直循环永远不可能被 m 整除&#xff0c;则打印 No 解析&#xff1a; 可以观…

BUU CODE REVIEW 1

BUU CODE REVIEW 1 考点&#xff1a;PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…

数据库中RIGHT_TYPE=3和RIGHT_TYPE=“3“的区别

G_USERINFO表归档条件SQL错误&#xff0c; RIGHT_RIGHT_TYPE3应改为RIGHT_TYPE"3"&#xff0c; 该字段为字符类型 在Oracle中&#xff0c;类型&#xff08;type&#xff09;通常是指数据库中的表、视图、索引、存储过程、函数等对象的的数据类型或结构。在比较类型&a…

解决:h5的<video>在移动端浏览器无法自动播放

并不是所有的移动端浏览器都无法自动播放&#xff0c;下载谷歌、火狐、edge等都可以正常播放&#xff0c;目前发现夸克浏览器无法自动播放。即autoplay属性失效。 <video autoplay"autoplay"></video> 可能移动端有移动端的策略&#xff0c;但解决夸克…

C++标识符的作用域与可见性

标识符是一个由程序员定义的名称&#xff0c;为标识区别变量、函数和数据类型等&#xff0c;代表程序的某些元素&#xff0c;变量名就是标识符的一个展现。 作用域讨论的是标识符的有效范围&#xff0c;可见性讨论的是标识符是否可以被引用。在一个函数中声明的变量就只能在这个…

vue中使用代码编辑器 vue2-ace-editor

npm install --save-dev vue2-ace-editor// 全局引入 main.jsimport Editor from vue2-ace-editor; Vue.use(Editor)//组件中引入import Editor from vue2-ace-editor; components: {Editor, },<template><div class"codeEditBox"><editorv-model&qu…

2353. 设计食物评分系统;1895. 最大的幻方;842. 将数组拆分成斐波那契序列

2353. 设计食物评分系统 核心思想&#xff1a;首先明确我们有哪些功能&#xff0c;首先是修改某种食物分数的功能&#xff0c;然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a 食物[分数],b 烹饪方式[分数&#xff0c;食物名字] 然后有一点经验的感…

小程序基础笔记

一、小程序与普通网页开发的区别 1、运行环境不同 网页运行在浏览器环境中小程序运行在微信环境中 2、API 不同 由于运行环境的不同&#xff0c;所以小程序中&#xff0c;无法调用 DOM 和 BOM 的 API。但是&#xff0c;小程序中可以调用微信环境提供的各种 API&#xff0c;例如…

初识低代码开发平台

2019年开始&#xff0c;低代码爆火&#xff0c;有人唱衰有人捧&#xff0c;反对的人认为对于那些真正的程序员来说&#xff0c;简直就是毒瘤&#xff0c;只是炒作概念而已&#xff0c;等尘埃落地&#xff0c;肯定一地鸡毛。 但是对于那些缺技术、缺人才&#xff0c;又需要数字…

ERROR:No tf data. Actual error: Fixed Frame [map] does not exist 解决办法

问题场景&#xff1a; 使用rviz时&#xff0c;出现warning&#xff0c;并且地图无法加载&#xff0c;如下所示&#xff1a; 原因分析&#xff1a; 之所以地图无法加载出来&#xff0c;其主要原因是tf树中没有world坐标系&#xff0c;解决方法就是让rviz知道world坐标系在哪…

短视频平台视频怎么去掉水印?

短视频怎么去水印&#xff0c;困扰很多人&#xff0c;例如&#xff0c;有些logo水印&#xff0c;动态水印等等&#xff0c;分享操作经验&#xff1a; 抖音作为中国最受欢迎的社交娱乐应用程序之一&#xff0c;已成为许多人日常生活中不可或缺的一部分。在使用抖音过程中&#x…

《TCP IP网络编程》第十四章

第 14 章 多播与广播 14.1 多播 多播&#xff08;Multicast&#xff09;方式的数据传输是基于 UDP 完成的。因此 &#xff0c;与 UDP 服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP 数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入&#xff08;注…

【奥比中光Gemini 2L快速上门】

奥比中光Gemini 2L快速上手 目录 奥比中光Gemini 2L快速上手[TOC](目录) 一、下载配置环境1.1 官网下载SDK1.2 配置环境 二、测试2.1 在bin中运行示例2.2 配置cmake 三、CMAKE3.1 CmakeLists.txt中各设置的意义 一、下载配置环境 1.1 官网下载SDK 进入官网&#xff0c;下载名…

maven的下载安装与配置环境变量!!!(全网最详细)

1.maven 官方网站&#xff0c;http://maven.apache.org 2.去官网下载。 3.选择你自己的解压路径&#xff08;D:\maven【我的挤压路径】&#xff09; 4.配置jdk环境变量&#xff08;不会的小伙伴可以看我以前的博客&#xff09; jdk 1.8 安装配置环境变量_明天更新的博客-CSD…

详细介绍Webpack5中的Plugin

Plugin的作用 插件Plugin可以扩展webpack&#xff0c;加入自定义的构建行为&#xff0c;使 webpack 可以执行更广泛的任务&#xff0c;拥有更强的构建能力。 Plugin的工作原理 webpack就像一条生产线&#xff0c;要经过一系列处理流程后才能将源文件转换成输出结果。 这条生…

Linux系统下MySQL读写分离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、基于Amoeba读写分离 1.基于程序代码内部实现 2.基于中间代理层实现 三、操作步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离…

matlab RRR机械臂 简略代码

RRR机器人&#xff01;启动&#xff01; gazebo在arm mac上似乎难以运行&#xff0c;退而选择Matlab&#xff0c;完成老师第一个作业&#xff0c;现学现卖&#xff0c;权当记录作业过程&#xff0c;有不足之处&#xff0c;多多指教。 作业&#xff01;启动&#xff01; RRR机…

WAF绕过-信息收集篇

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…