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…

串口通信(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…

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

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

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…

安全防御——二、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…

航模模拟器训练

固定翼吃灰很久忘记咋么操作 故这里发帖防止忘记 准备物品 航模遥控器 aux线 即两端都是耳机插头的线 解密狗 电脑 phoenixRC 航模模拟软件(【飞舜极创】凤凰5.0飞行模拟器 安装和设置方法_哔哩哔哩_bilibili) 链接&#xff1a;https://pan.baidu.com/s/1XL4ZWhMR7MQMxDPC7B…

GraphQL入门与开源的GraphQL引擎Hasura体验

背景 Hasura 是一个开源的 GraphQL 引擎&#xff0c;它可以帮助开发人员快速构建和部署现代应用程序的后端。它提供了一个自动化的 GraphQL API &#xff0c;可以直接连接到现有的数据库&#xff0c;并提供实时数据推送和订阅功能。 Hasura 团队总部位于印度。 下载安装 脚本…

分享86个工作总结PPT,总有一款适合您

分享86个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/12aRTr5NKG5YTnMnwNbqOrQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知…

顶层模块【FPGA】

1顶层模块&#xff1a; 不能像C语言的h文件那样&#xff0c;把io的定义放在其他文件。 在Verilog中&#xff0c;顶层模块是整个设计的最高层次&#xff0c;它包含了所有其他模块和子模块。 顶层模块定义了整个设计的输入和输出端口&#xff0c;以及各个子模块之间的连接方式。…

大数据毕业设计选题推荐-旅游景点游客数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

使用vscode开发uniapp项目常用的辅助插件,提升开发效率

为什么不使用hbuilder开发呢&#xff1f;因为hbuilder对ts和vue3语法支持并不友好&#xff0c;而且代码提示不智能&#xff0c;也不能使用最近很流行的coplit和CodeGeex智能提示&#xff0c;所以就换掉hbulider&#xff0c;使用我们熟悉的vscode开发吧。 第一个&#xff1a;un…