Linux生成静态库

GCC

什么是GCC

GCC 是 GNU 编译器集合(GNU Compiler Collection)的缩写。它是一个开源的编程语言编译器,支持多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 和 Go 等。GCC 最初由理查德·斯托曼(Richard Stallman)创建,它是自由软件基金会(Free Software Foundation)的一部分,遵循 GNU 通用公共许可证(GNU General Public License)。

GCC编译流程

在这里插入图片描述

GCC 常用命令

选项说明
-E只预处理指定源文件,不编译
-S编译指定源文件,不汇编
-c编译汇编指定源文件,不链接
-o [file1] [file2]将文件 file2 编译成可执行文件 file1
-Onn 得反胃是 [ 1 , 3 ] [1,3] [1,3] ,数字越大优化级别越高,编译时间越长,默认是 O1
-I directory指定编译时头文件所在的目录
-l指定编译时使用的库
-L指定编译时使用库所在的路径
-g编译时生成调试信息,表示该程序可以被调试器调试
-D在编译时指定一个宏
-fpic生成与位置无关的代码
-shared生成共享目标文件,通常用在建立共享库的时候
-std指定语言标准
-W不生成任何警告
-Wall生成所有警告

示例程序:

# 分步编译
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o main# 一步到位
gcc main.c -o main#多文件编译
gcc test.c main.c -o main

静态库

1.什么是库

  • 库文件是计算机上的一类文件,可以简单的把库文件看成是一种代码仓库,它提供给使用者一些直接可以拿来使用的变量、函数 和 类;

  • 库是一种特殊的程序,库的编写和一般的程序没区别,只是库不能独立运行

  • 库文件有两种,静态库 和 动态库(共享库),区别是:

    • 静态库在程序 链接阶段 被复制到了程序中;
    • 动态库在 链接阶段 没有被复制到程序中,而是在程序运行时由系统动态的加载到内存中供程序调用;

2.库的优点

  • 代码是保密的;
  • 方便部署和分发;

3.静态库的制作

命名规则

Linux:libxxx.a

  • lib :前缀(固定的);
  • xxx:库的名字(自己取名);
  • .a:后缀(固定的);

Windows:libxxx.lib

静态库制作
  1. gcc 编译,不链接,获得 .o 文件;
  2. .o 文件打包,使用 ar 工具(archive) ar rcs libxxx.a xxx.o xxx.o ...
  • r ,将文件插入到备存文件当中去;
  • c ,建立备存文件;
  • s,建立索引;

4.示例

在 Linux 中创建如下的一个 demo 的目录结构:

在这里插入图片描述

从上到下依次的代码为:

head.h

#include <stdio.h>int add(int a,int b);int sub(int a,int b);int mul(int a,int b);double div(int a,int b);

main.c

#include <stdio.h>#include "head.h"int main(){int a = 10 , b = 20;printf("a = %d , b = %d\n",a,b);printf("a + b = %d\n",add(a,b));printf("a - b = %d\n",sub(a,b));printf("a * b = %d\n",mul(a,b));printf("a / b = %.2lf\n",div(a,b));return 0;
}

add.c

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

sub.c

#include "head.h"int sub(int a,int b){return a - b;
}

mul.c

#include "head.h"int mul(int a,int b){return a * b;
}

div.c

#include "head.h"double div(int a,int b){return a * 1.0 / b;
}
1.首先制作静态库 libcal.a
  1. 来到 src 目录下,首先要获得 .o 文件:

在这里插入图片描述

这里报错了,显示找不到 head.h 头文件。

因为 head.h 头文件是在 include 目录下,从当前所在目录程序是无法找到的,我们只需要指定头文件的所在路径即可。

在这里插入图片描述

  1. .o 文件打包,生成库文件 libcal.a

在这里插入图片描述

2.生成可执行程序 app
  1. src 目录下生成的静态库移动到 lib 目录下:

在这里插入图片描述
2. 生成可执行文件 app

在这里插入图片描述

  • -I ./include/ 表示指定库文件的路径为 当前目录下的 include 目录下;
  • -L ./lib/ 指定库文件所在的路径;
  • -l cal 表示使用的是 名为cal 库文件;
3.执行

在这里插入图片描述

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

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

相关文章

2022最新版-李宏毅机器学习深度学习课程-P32 Transformer

一、 seq2seq 1. 含义 输入一个序列&#xff0c;机器输出另一个序列&#xff0c;输出序列长度由机器决定。 文本翻译&#xff1a;文本至文本&#xff1b;  语音识别&#xff1a;语音至文本&#xff1b;  语音合成&#xff1a;文本至语音&#xff1b;  聊天机器人&#…

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…

HarmonyOS 数据管理与应用数据持久化(二)

通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据&#xff0c;当需要存储的数据没有复杂的关系模型&#xff0c;比如存储商品名称及对应价格、员工工号及今日是否已出勤等&#xff0c;由于数据复杂度低&#xff0c;更容易兼容不同数据库版本和设备…

Gradle笔记 一 Gradle的安装与入门

文章目录 Gradle 入门Gradle 简介学习Gradle 的原因&#xff1a; 常见的项目构建工具Gradle 安装Gradle 安装说明安装JDK 下载并解压到指定目录配置环境变量检测是否安装成功 Gradle 项目目录结构Gradle 创建第一个项目Gradle 中的常用指令修改maven 下载源Wrapper 包装器使用教…

项目管理之如何估算项目工作成本

在项目管理中&#xff0c;如何估算项目工作成本是一个关键问题。为了解决这个问题&#xff0c;我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点&#xff0c;但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…

InnoDB中Buffer Pool详解

1. 概念及特点 Buffer Pool 是 MySQL 中 InnoDB 存储引擎用来缓存表数据和索引数据的内存区域。这个内存区域被用来存储磁盘上的数据页的副本&#xff0c;这样常用的数据可以在内存中快速被访问&#xff0c;而不必每次都从磁盘中读取。 以下是 Buffer Pool 的一些重要特点&a…

学习c++的第十二天

目录 多态性 多态性 虚函数 虚析构函数 纯虚函数 多态性 多态性 多态性的实现依赖于继承和虚函数。在面向对象编程中&#xff0c;通过基类的指针或引用来调用派生类的成员函数时&#xff0c;可以根据实际的对象类型决定调用哪个类的成员函数&#xff0c;从而实现多态性。…

串口通信(6)应用定时器中断+串口中断实现接收一串数据

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

I/O多路转接之select

承接上文&#xff1a;I/O模型之非阻塞IO-CSDN博客 简介 select函数原型介绍使用 一个select简单的服务器的代码书写 select的缺点 初识select 系统提供select函数来实现多路复用输入/输出模型 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的; 程序会停在s…

springboot+Redis+AOP实现请求限流器

写在开头 本文参考技术帖 程序员那点事 主要对学习经验进行总结&#xff0c;也会加上自己的理解注释。 配置RedisTemplate实例 //配置redis 使用String数据结构 //对key value 进行序列化 //根据配置连接redis Configuration public class RedisLimiterHelper {Beanpublic …

unittest 通过TextTestRunner(failfast=True),失败或错误时停止执行case

failfast是unittest.TextTestRunner的一个参数&#xff0c;它用于控制测试运行过程中遇到第一个失败或错误的测试方法后是否立即停止执行。 当failfast设置为True时&#xff0c;一旦发现第一个失败或错误的测试方法&#xff0c;测试运行就会立即停止&#xff0c;并输出相应的失…

Java多版本环境共存配置

文章目录 1. jenv是什么&#xff1f;2. 安装3. 配置4.多版本切换5. 总结 现在已经基本过了那句“他发由他发&#xff0c;我用Java8”的时代了&#xff0c;越来越多的开发者开始拥抱Java11&#xff0c;Java17&#xff08;毕竟spring boot 3要求最低这个版本了&#xff09;&#…

如何保证缓存中都是热点数据?

确保缓存中保留热点数据是关键&#xff0c;因为热点数据通常是最常被访问的数据&#xff0c;提高了缓存的命中率和整体性能。以下是一些策略和方法&#xff0c;能够帮助你维护缓存中的热点数据&#xff1a; 缓存策略&#xff1a; 缓存预热&#xff1a; 在系统启动时或负载较低的…

sql基础+考点+题

查询&#xff1a;select from 筛选&#xff1a;where and和or 排序&#xff1a;order by&#xff08;降序排列需要指定DESC关键字&#xff09; join&#xff1a;left join 、right join 和inner join 分组聚合&#xff1a;group by ---搭配count , sum , avg 过滤&#x…

前端面试大纲

一、CSS 1.说一下CSS的盒模型。 在HTML页面中的所有元素都可以看成是一个盒子 盒子的组成&#xff1a;内容content、内边距padding、边框border、外边距margin 盒模型的类型&#xff1a; 标准盒模型 margin border padding content IE盒模型 margin content(border padd…

安全防御——二、ENSP防火墙实验学习

安全防御 一、防火墙接口以及模式配置1、untrust区域2、trust区域3、DMZ区域4、接口对演示 二、防火墙的策略1、定义与原理2、防火墙策略配置2.1 安全策略工作流程2.2 查询和创建会话 3、实验策略配置3.1 trust-to-untrust3.2 trust-to-dmz3.3 untrust-to-dmz 三、防火墙的区域…

消息中间件-RabbitMQ介绍

一、基础知识 1. 什么是RabbitMQ RabbitMQ是2007年发布&#xff0c;是一个在AMQP(高级消息队列协议)基础上完成的&#xff0c;简称MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法&#xff0c;由Erlang&#xff08;专门针对于大…

SPSS单因素方差分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python基础入门例程39-NP39 字符串之间的比较(运算符)

最近的博文&#xff1a; Python基础入门例程38-NP38 牛牛的逻辑运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程37-NP37 不低于与不超过&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程36-NP36 谁的数字大&#xff08;运算符&#xff09;-CSD…

FPGA芯片内部结构

参考链接&#xff1a;FPGA的进阶之第二章FPGA芯片内部结构&#xff08;2&#xff09;