Linux生成静态库

news2024/11/27 7:34:25

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.coloradmin.cn/o/1173020.html

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

相关文章

VEX —— Quaternion|Euler Angle

目录 一&#xff0c;四元数相关概念 四元数 欧拉角 常用四元数相关函数 相互转换 二&#xff0c;案例 案例&#xff1a;沿面中心翻转 案例&#xff1a;路径导弹 一&#xff0c;四元数相关概念 四元数 在vex内四元数为&#xff08;&#xff08;x&#xff0c;y&#xff0…

vmware--主机win11 samba 映射虚拟机ubuntu共享文件夹

参考链接 1.效果如下图 2.教程 2.1 win11开启 smb 忽略… 2.2 vmware–ubuntu 安装 samba sudo apt update sudo apt install samba2.3 vmware–ubuntu 验证 安装成功 ppan:~$ whereis samba samba: /usr/sbin/samba /usr/lib/x86_64-linux-gnu/samba /etc/samba /usr/sh…

《向量数据库指南》——用了解向量数据库Milvus Cloud搭建高效推荐系统

了解向量数据库 ANN 搜索是关系型数据库无法提供的功能。关系型数据库只能用于处理具有预定义结构、可直接比较值的表格型数据。因此,关系数据库索引也是基于这一点来比较数据。但是 Embedding 向量无法通过这种方式直接相互比较。因为我们不知道向量中的每个值代表什么意思,…

【LeetCode:187. 重复的DNA序列 | 滑动窗口 map】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

ssm整合原理与实战

文章目录 前言一、SSM整合原理1.1 什么是SSM整合1.2 SSM整合核心问题1.2.1 第一问&#xff1a;SSM整合需要几个IoC容器&#xff1f;1.2.2 第二问&#xff1a;每个IoC容器对应哪些类型组件&#xff1f;1.2.3 第三问&#xff1a;IoC容器之间关系和调用方向&#xff1f;1.2.4第四问…

CSS画圆以及CSS实现动态圆

CSS画圆以及CSS实现动态圆 1. 先看基础&#xff08;静态圆&#xff09;1.1 效果如下&#xff1a;1.2 代码如下&#xff1a; 2. 动态圆2.1 一个动态圆2.1.1 让圆渐变2.1.2 圆渐变8秒后消失2.1.3 转动的圆&#xff08;单个圆&#xff09; 2.2 多个动态圆 1. 先看基础&#xff08;…

LangChain+LLM实战---部署本地大模型(基于Langchain)

原文&#xff1a;Training Your Own LLM using privateGPT 作者&#xff1a;Wei-Meng Lee 了解如何在不向提供者公开私有数据的情况下训练自己的语言模型 使用公共AI服务(如OpenAI的ChatGPT)的主要问题之一是将您的私人数据暴露给提供商的风险。对于商业用途&#xff0c;这仍然…

K8S知识点(三)

&#xff08;1&#xff09;环境搭建-环境初始化 Centos的版本是有要求的必须是7.5或以上&#xff0c;否则安装出来的集群是有问题的Node节点可能加入不到集群中来 详细步骤 1.同时连接三台服务器&#xff1a;查看一下版本 是否正确 2.主机名解析&#xff0c;方便节点之间的…

PDF文件解析

一、PDF文件介绍 PDF是英文Portable Document Format缩写&#xff0c;就是可移植的意思&#xff0c;它是以PostScript语言图象模型为基础&#xff0c;无论在哪种打印机上都可保证精确的颜色和准确的打印效果&#xff0c;PostScript咱也不懂&#xff0c;估计和SVG的原理差不多吧…

视频剪辑技巧:批量合并视频,高效省时,添加背景音乐提升品质

随着社交媒体的兴起&#xff0c;视频制作越来越受到人们的关注。掌握一些视频剪辑技巧&#xff0c;可以让我们轻松地制作出令人惊艳的视频。本文将介绍一种高效、省时的视频剪辑技巧&#xff0c;帮助您批量合并视频、添加背景音乐&#xff0c;并提升视频品质。现在一起来看看云…

Redis那些事儿(二)

文章目录 1. 前言2. 消息队列&#xff08;发布和订阅&#xff09;应用场景&#xff1a;消息通知、Websocket集群 3. WebSocket集群示例 1. 前言 接着上一篇Redis那些事儿&#xff08;一&#xff09; &#xff0c;这一篇主要介绍Redis的发布和订阅功能&#xff0c;可以实现高效的…

代码随想录算法训练营第11天|20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

JAVA代码编写 20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括…

2024最新mac电脑清理垃圾的软件有哪些?

mac电脑是许多人喜爱的电子产品&#xff0c;它拥有优美的设计、流畅的操作系统和强大的性能。但是&#xff0c;随着使用时间的增长&#xff0c;mac电脑也会积累一些不必要的垃圾文件&#xff0c;这些文件会占用宝贵的存储空间&#xff0c;影响电脑的运行速度和稳定性。因此&…

华为OD机试 - 服务失效判断 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

第五章:java标识符|关键字|保留字|键盘输入

系列文章目录 文章目录 系列文章目录前言一、标识符二、关键字三、保留字四、键盘输入语句总结 前言 java程序就是对象的操作&#xff0c;对象名要起的好。 一、标识符 标识符命名规范例子包名多单词组成时所有字母都小写&#xff1a; aaa.bbb.ccccom.hsp.crm类名、 接口名多单…

Pycharm的安装与基本使用

Pycharm的安装与基本使用 一、Pycharm介绍1.1 Pycharm简介1.2 Pycharm特点 二、Pycharm软件下载2.1 Pycharm官网2.2 下载Pycharm 三、安装Pycharm3.1 指定安装目录3.2 勾选安装选项3.3 选择菜单目录3.4 安装成功 四、Pycharm的初始配置4.1 新建工程4.2 选择Python解释器4.3 打开…

阅读论文StyleGAN2-ada

在图像分类任务中,使用旋转、噪声等数据增强方法训练图像分类器,可以提高分类器对这些保留语义的扭曲的不变性,这是图像分类器极为期望的一种质量。 引用Bora等人的工作,指出只要增强过程可以表示为概率分布上的可逆变换,那么训练过程中网络可以消除这种增强,找到正确的分布。…

Windows ObjectType Hook 之 OkayToCloseProcedure

1、背景 Object Type Hook 是基于 Object Type的一种深入的 Hook&#xff0c;比起常用的 SSDT Hook 更为深入。 有关 Object Type 的分析见文章 《Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析》。 这里进行的 Hook 为 其中之一的 OkayToCloseProcedure。…

(后续补充)vue+express、gitee pm2部署轻量服务器

首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 首先 防火墙全部关闭算了 关闭防火墙 systemctl stop firewalld 重新载入防火墙使设置生效 firewall-cmd --reload 后端的 pm2.config.cjs …

一文理解JPA中的save()方法为什么有时候只能插入无法更新

总结&#xff1a;使用save()方法更新某一具体的记录&#xff08;如用户密码&#xff09;&#xff0c;必须要提供该记录的ID。 以常见的用户管理为例&#xff0c;当我们调用userRepository.save()时&#xff0c;这是它背后的逻辑&#xff1a; 如果实体的ID为null或者不在数据库…