首页 > 其他分享 >大话C语言:第26篇 静态库

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

时间:2024-07-01 20:56:26浏览次数:3  
标签:文件 26 lib 编译 静态 大话 MathFun C语言 int

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后缀

标签:文件,26,lib,编译,静态,大话,MathFun,C语言,int
From: https://blog.csdn.net/whccf/article/details/140109853

相关文章

  • 16_C语言编程基础
    目录C语言入门程序段和代码段C语言入门实例英文分号(;)注释标识符保留字C中的空格C数据类型基本类型sizeof获取存储字节void类型变量C数组C枚举C中的左值(lvalue)和右值(rvalue)C常量变量存储类型C常用关键字(保留字)宏定义#defineconst关键字static关......
  • x264 编码器x264.h文件中结构体详细介绍
    x264_picture_t定义:在x264.h文件中定义typedefstructx264_picture_t{/*In:forcepicturetype(ifnotauto)*Ifx264encodingparametersareviolatedintheforcingofpicturetypes,*x264willcorrecttheinputpicture......
  • 利用阿里云API获取实时天气信息|C语言Linux网络编程练手小项目
    文章目录目录文章目录前言一、HTTP数据请求1.HTTP概述2.数据请求方式3.JSON格式二、阿里云API获取,使用1.购买(白嫖)API接口步骤2.API使用代码编写3.编译程序 4.运行结果总结前言在项目开发时常常需要显示各种信息,如时间、天气、温度、空气质量指数等等。在......
  • 26-包装类
    什么是包装类基本数据类型所对应的引用数据类型Object可以统一所有数据,包装类的默认值是null包装类对应类型转换与装箱、拆箱栈里边的数据,拿到堆里边叫装箱(基本类型转成引用类型),反之叫拆箱//类型转换:装箱(基本类型转引用类型)intnum1=18;/......
  • C++ //练习 14.17 你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应
    C++Primer(第5版)练习14.17练习14.17你在7.5.1节的练习7.40(第261页)中曾经选择并编写了一个类,你认为它应该含有相等运算符吗?如果是,请实现它;如果不是,解释原因。环境:LinuxUbuntu(云服务器)工具:vim 代码块classDate{ public: Date(); Date(size_ty,size_tm,siz......
  • 探索Toshiba东芝TLP265J光耦合器
    在当今的电子元件市场中,寻找高质量和高可靠性的光耦合器解决方案对许多工程师和设计师来说至关重要。TLP265J这款产品在性能、安全性和可靠性方面均表现卓越,适用于多种工业和商业应用。本文将深入探讨TLP265J的特点、应用领域以及其技术优势,帮助您更好地理解这款产品,并为您的设......
  • 第26节 对象的定义和使用
    第26节对象的定义和使用1.对象的的定义及对象的动态建立和释放1、对象的的定义►定义一个类时,也就是定义了一个具体的数据类型。若要使用类,需要将类实例化,即定义该类的对象。►需要注意,我们之前也使用了“对象”一词,那里主要是指数据对象。►从现在起,“对象”一词......
  • C语言--vs使用调试技巧
     1.什么是bug?1.产品说明书中规定要做的事情,而软件没有实现。2.产品说明书中规定不要做的事情,而软件确实现了。3.产品说明书中没有提到过的事情,而软件确实现了。4.产品说明书中没有提到但是必须要做的事情,软件确没有实现。5.软件很难理解,很难使用,速度超慢,测试人员站在......
  • 墨烯的C语言技术栈-C语言基础-001
    (最近报名了9月的计算机二级得好好重温一下C语言祝我计算机二级必过!)学习视频为B站的哔哩大学计算机学院参考书籍为C语言程序设计第五版(张磊主编)一.什么是C语言C语言是一门通用计算机编程语言广泛应用底层开发C语言的设计目标是提供一种能以简易的方式编译处理低级存......
  • c语言malloc、calloc 和 realloc动态分配内存函数的区别
    c语言malloc、calloc和realloc动态分配内存函数的区别malloc、calloc和realloc是C语言中用于动态内存分配的三个重要函数,它们之间有一些关键的区别。以下是这三个函数的区别,以分点表示和归纳的形式进行解释:内存来源和初始化:malloc:在堆上分配指定大小的内存块,但不进行初始化......