大话C语言:第26篇 静态库

1 静态库概述

C语言静态库(Static Library)是一种包含一组目标文件的归档文件,这些目标文件通常是由多个C语言源文件编译而成的。静态库在程序编译时被链接到目标程序中,成为程序的一部分,因此在运行时不再需要额外的库文件。与动态库(Dynamic Library)不同,静态库在编译时就已经被完全嵌入到可执行文件中,因此生成的可执行文件通常较大,但无需在运行时依赖外部库文件。

静态库通常具有.a的文件扩展名(代表archive),而在Windows中则通常使用.lib扩展名。创建静态库的过程涉及将多个目标文件(通常由.o.obj文件组成)打包成一个单独的库文件。

使用静态库的好处之一是,它使得程序在分发时更加简单,因为所有必要的代码都已经包含在可执行文件中。此外,由于静态链接在编译时就已经完成,因此可以避免运行时动态链接可能带来的版本兼容性问题。然而,静态库也有一些缺点,比如生成的可执行文件较大,以及如果多个程序使用相同的静态库,那么每个程序都会包含库的一份完整副本,导致磁盘空间的浪费。

2 静态库制作

例如,实现一个简单的数学运算MathFun.c

// 静态库中的函数,用于加法  
int add(int a, int b) 
{  return a + b;  
}  // 静态库中的函数,用于减法  
int subtract(int a, int b) 
{  return a - b;  
}
  • 通过gcc -c编译源代码,生成目标文件.o

  • 通过ar rc(或rcs)将目标文件.o打包生成静态库.a文件

gcc -c MathFun.c -o MathFun.o   
ar rc libMathFun.a MathFun.o

注意,库文件需要以lib开头,例如上述数学库,libMathFun.a;如果不带lib的话,将库文件链接至可执行文件时,可能会引起编译错误,如下:

# mathfunc.a放在dynamicdemo/lib目录下
whccf@whccf-VirtualBox:~/code/staticdemo$ gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib -lmathfunc
/usr/bin/ld: 找不到 -lmathfunc
collect2: error: ld returned 1 exit status# 解决方案
# 将dynamicdemo/lib下的mathfunc.a重新命名为libmathfunc.a,然后,再次使用gcc命令重新编译即可。

3 静态库使用

主程序calculator.c,它使用静态库中的函数

#include <stdio.h>  
#include "MathFun.h"  int main()
{  int a = 5;  int b = 3;  int sum = add(a, b);  int diff = subtract(a, b);  printf("Sum: %d\n", sum);  printf("Difference: %d\n", diff);  return 0;  
}

为了编译这个程序并链接静态库,需要使用以下命令:

gcc -o calculator calculator.c -L /home/whccf/code/staticdemo/lib/ -lMathFun

其中,

  • -L.告诉编译器在当前目录下查找库文件

  • -lMathFun则告诉编译器链接名为libMathFun.a的库,注意不需要提供.a后缀

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

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

相关文章

java Lambda表达式介绍

Lambda 表达式是 Java 8 中引入的一种语法糖,用于简化使用函数式接口的代码编写。它使得 Java 编程更加简洁和灵活,特别是在处理集合数据、事件监听器等方面提供了便利。 Lambda 表达式的语法 Lambda 表达式的基本语法如下: (parameters) -> expression或者是一个代码…

盘古5.0,靠什么去解最难的题?

文&#xff5c;周效敬 编&#xff5c;王一粟 当大模型的竞争开始拼落地&#xff0c;商业化在B端和C端都展开了自由生长。 在B端&#xff0c;借助云计算向千行万业扎根&#xff1b;在C端&#xff0c;通过软件App和智能终端快速迭代。 在华为&#xff0c;这家曾经以通信行业起…

Error: A JNl error has occurred, please check your installation and try again.

Eclipse 运行main方法的时候报错&#xff1a;Error: A JNl error has occurred, please check your installation and try again. 一、问题分析 导致这个问题&#xff0c;主要原因&#xff0c;我认为是在新版本中&#xff0c;默认的JDK编译版本与我们配置的JDK版本不一致导致的…

公网环境使用Potplayer远程访问家中群晖NAS搭建的WebDAV听歌看电影

文章目录 前言1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav4 内网穿透&#xff0c;映射至公网5 使用固定地址在potplayer访问webdav 前言 本文主要介绍如何在Windows设备使用potplayer播放器远程访问本地局域网的群晖NAS中的影视资源&#xff…

告别流失,拥抱增长!Xinstall智能邀请系统,让你的App拉新更高效

在移动互联网时代&#xff0c;App的推广和运营面临着诸多挑战。其中&#xff0c;如何有效地进行邀请拉新活动&#xff0c;吸引更多新用户&#xff0c;成为了每个运营者都需要面对的问题。今天&#xff0c;我们将为大家介绍一款能够帮助你轻松解决这一难题的神器——Xinstall。 …

C语言从头学28——数组(一)

一、基本概念 数组是一组相同类型的值被顺序地储存在一起。数组表示方法为变量名加方括号&#xff0c;方括号里是数组的成员数量。例如&#xff1a; int arr[20]; //声明了一个 int 类型的名为 arr 包含20个成员的数组 数组的成员是从0开始编号的&#x…

深入理解Symfony框架的环境配置策略

引言 Symfony是一个高度灵活的PHP框架&#xff0c;它允许开发者通过配置文件来定制应用程序的行为&#xff0c;以适应不同的运行环境。环境配置是Symfony中一个重要的概念&#xff0c;它允许开发者为开发、测试和生产环境设置不同的配置参数。本文将详细探讨Symfony的环境配置…

7-491 3名同学5门课程成绩,输出最好成绩及所在的行和列(二维数组作为函数的参数)

编程:数组存储3名同学5门课程成绩 输出最好成绩及所在的行和列 要求&#xff1a;将输入、查找和打印的功能编写成函数 并将二维数组通过指针参数传递的方式由主函数传递到子函数中 输入格式: 每行输入一个同学的5门课的成绩&#xff0c;每个成绩之间空一格&#xff0c;见输入…

互联网框架五层模型详解

注&#xff1a;机翻&#xff0c;未校对。 What is the Five Layers Model? The Framework of the Internet Explained 五层模型互联网框架解释 Computer Networks are a beautiful, amazing topic. Networks involve so much knowledge from different fields, from physics…

Elasticsearch架构基本原理

Elasticsearch的架构原理可以详细分为以下几个方面进行介绍&#xff1a; 一、Elasticsearch基本概念 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索和分析引擎。它支持全文搜索、结构化搜索、半结构化搜索、数据分析、地理位…

[数据集][目标检测]城市街道井盖破损未盖丢失检测数据集VOC+YOLO格式4404张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4404 标注数量(xml文件个数)&#xff1a;4404 标注数量(txt文件个数)&#xff1a;4404 标注…

note-网络是怎样连接的6 请求到达服务器,响应返回浏览器

助记提要 服务器程序的结构套接字的指代方式MAC模块的接收过程IP模块的接收过程TCP模块处理连接包TCP模块处理数据包TCP模块的断开操作URI转换为实际文件路径URI调用程序Web服务器访问控制响应内容的类型 6章 请求到达服务器&#xff0c;响应返回浏览器 1 服务器概览 在数据…

昇思25天学习打卡营第03天 | 张量 Tensor

昇思25天学习打卡营第03天 | 张量 Tensor 文章目录 昇思25天学习打卡营第03天 | 张量 Tensor张量张量的创建张量的属性Tensor与NumPy转换稀疏张量CSRTensorCOOTensor 总结打卡 张量 张量&#xff08;Tensor&#xff09;是一种类似于数组和矩阵的特殊数据结构&#xff0c;是神经…

MATLAB|更改绘图窗口的大小和位置

MATLAB绘图 plot、plot3、cdfplot都适用 效果 如下图&#xff0c;运行程序后可以直接得到这两个绘图窗口。 右上角的Figure1是原始图片&#xff0c;右下角的Figure2是调整了位置和大小后的绘图窗口。 完整源代码 % 绘图大小和位置调整 % Evand©2024 % 2024-7-1/Ver1…

Transformer模型原理细节解析

基本原理: Transformer 的核心概念是 自注意力机制(Self-Attention Mechanism),它允许模型在处理每个输入时“关注”输入序列的不同部分。这种机制让模型能够理解每个单词或符号与其他单词或符号之间的关系,而不是逐个地线性处理输入。 Transformer 主要由两个部分组成:…

手把手教你搭建PyTorch环境:MindStudio中PyTorch模型开发实战

本次实验的视频链接如下&#xff1a;​https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次实验在MindStudio上进行&#xff0c;请先按照 教程 配置环境,安装MindStudio。 ​ MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台&#xff0c;该IDE上功能很多…

Boost 智能指针

scoped_ptr 不能被复制或赋值给其他 scoped_ptr 对象,不能与其他指针比较 (除了 nullptr) scoped_ptr 用例 template <typename T> class scoped_ptr {public:// 构造函数:初始化 scoped_ptr 并接管指针的所有权explicit scoped_ptr(T* ptr = nullptr) : ptr_(ptr) …

Flink CDC的使用

MySQL数据准备 create database if not exists test; use test; drop table if exists stu; create table stu (id int primary key auto_increment, name varchar(100), age int); insert into stu(name, age) values("张三",18); insert into stu(name, age) valu…

ESOP 系统助力电子设备公司的管理模式升级

在科技飞速发展的时代&#xff0c;电子设备行业竞争愈发激烈&#xff0c;企业要想在市场中立足并持续发展&#xff0c;不断升级管理模式成为关键。ESOP系统的引入&#xff0c;为电子设备公司带来了全新的机遇&#xff0c;有力地推动了管理模式的升级。 ESOP 系统首先为电子设备…

element el-table表格切换分页保留分页数据+限制多选数量

el-table表格并没有相关的方法来禁用表头里面的多选按钮 那么我们可以另辟蹊径&#xff0c;来实现相同的多选切换分页&#xff08;保留分页数据&#xff09; 限制多选数量的效果 <el-table:data"tableData"style"width: 100%">// 不使用el-talbe自带…