【项目】GCC(gcc,g++)、静态库的制作与使用、动态库

news2024/11/25 0:38:11

GCC、静态库

    • 1.2 GCC(1)gcc
      • (1)常用命令
      • (2) C程序编译过程
      • (3)GCC工作流程
    • 1.3 GCC(2)g++
    • 1.3静态库的制作
    • 1.5静态库的使用
    • 1.6动态库的制作
    • 1.7动态库加载失败的原因
    • 1.8解决动态库加载失败的原因
    • 1.9静态库与动态库对比

1.2 GCC(1)gcc

在这里插入图片描述

(1)常用命令

1、ctrl+l 清空屏幕
2、使用gcc编译
gcc xx.c -o app
解释:gcc + 文件名 + -o(用于指定编译后的文件名) + app(文件名)
3、生成可执行文件
./app
解释:运行刚刚编译出来的文件
如果gcc xx.c -o app不加-o,只有gcc xx.c
那么会生成一个a.out的可执行程序

(2) C程序编译过程

在这里插入图片描述

高级语言 编译 成汇编语言
汇编语言 汇编 成机器语言
机器语言 运行

(3)GCC工作流程

在这里插入图片描述

预处理:
1、展开头文件,将头文件中的内容复制进源代码
2、删除注释
3、对定义的宏做宏替换
指令: gcc test.c -E -o test.i

编译器:
将源代码编译成汇编代码(.s)
gcc test.i -S -o test.s
直接执行gcc test.c -S也会生成.s文件(就包含了预处理这一步)

汇编器:
将汇编代码汇编成目标代码(.O)
gcc test.s -c -o test.o

链接:
-c 生成目标代码 test.o,test.o 不是一个可执行程序。如果下一步需要继续链接成可执行程序,需要输入指令 gcc test.o -o test.out(这里直接将 .o 目标文件链接成可执行程序 test.out,可以有多个 .o 文件,这里只有一个

所以整个直接 gcc test.c 包含了预处理,编译,汇编,链接成可执行文件4步。

1.3 GCC(2)g++

别管那么多,c就用gcc,cpp就应g++

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
-D使用示例:


#include <stdio.h>
#define PI 3.14

int main(){
    int a = 10;
#ifdef DEBUG
    printf("我不会爬树\n");
#endif // DEBUG
    for(int i = 0; i < 3; ++i){
        printf("hello,GCC\n");
    }
    return 0;
}   

在这里插入图片描述
-Wall使用示例:
在这里插入图片描述

在这里插入图片描述

1.3静态库的制作

在这里插入图片描述静态库实际上是将.c文件们打包。这些.c文件定义的函数,都在.h文件中申明。这样只需要把静态库和头文件给用户,用户就可以知道那些函数可以调用,但不清楚函数的具体实现。

-c使用示例:(生成.o文件)
在这里插入图片描述制作静态库之前,首先需要把.c文件用gcc命令和 -c选项做成.o文件。 src目录下:gcc -c add.c div.c mult.c sub.c 是要报错的,因为找不到.h文件。如下所示。
在这里插入图片描述所以实际上还要加上-I(大写i)选项,后面跟上.h所在的文件夹路径,告诉编译器去这个路径下找头文件:
gcc -c add.c div.c mult.c sub.c -I …/include/
注:.c文件在-c选项的前面还是后面无所谓
gcc add.c div.c mult.c sub.c -c -I …/include/
也可以。

ar命令的使用:(将.o文件打包成静态库)
ar rcs libsuanshi.a add.o div.o sub.o mult.o
移动命令:mv + 文件名 + 目的文件夹路径

1.5静态库的使用

在这里插入图片描述

参数选项
1、-I(大写i) :查找头文件的路径 (后面跟目录)
使用: -I 路径
例如:gcc main.c -o app -I ./include/
在这里插入图片描述此时只找到了头文件,但没找到这些函数的定义,也就是静态库

2、-l(小写L):指定加载哪个库(后面跟的是库名字,不是库的文件名)
文件名:libcala.a
库名:calc

3、-L:指定到哪个文件夹下去找静态库(后面跟目录)

示例:
gcc main.c -o app -I ./include/ -l calc -L ./lib/
在这里插入图片描述

1.6动态库的制作

在这里插入图片描述什么叫:与位置无关?

1、制作动态库:
生成与位置无关的.o文件
gcc -c -fpic add.c div.c sub.c mult.c
生成动态库
gcc -shared add.o sub.o mult.o div.o -o libcalc.so

2、使用动态库
在这里插入图片描述
与使用静态库一样,要指定头文件所在路径。动态库所在路径以及要使用的动态库名字(不是文件名字)
gcc main.c -o main -I ./include/ -l calc -L ./lib/

但这样使用会报错,运行main这个可执行文件的时候找不到动态库文件
在这里插入图片描述

1.7动态库加载失败的原因

在这里插入图片描述

ldd:list dynamic dependendcies 列出动态依赖库
在这里插入图片描述后面的一串数组是内存地址,此时可以看到 libcalc.so这个动态库没有被找到。

每个程序就是一个进程,linux会为每个进程分配虚拟地址空间(DT_RPATH段)

1.8解决动态库加载失败的原因

1.9静态库与动态库对比

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

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

相关文章

六面钻调试流程(第一步.设置轴参数)

第一步.设置轴参数 &#xff08;1&#xff09;编码器类型 &#xff08;2&#xff09;编码器位数 &#xff08;3&#xff09;设置站地址开关 &#xff08;4&#xff09;设置从站地址 &#xff08;5&#xff09;设置从站地址偏移地址

【云原生】docker-Cgroup资源限制

Docker容器的资源控制 Docker通过Cgroup 来控制容器使用的资源配额&#xff0c;包括CPU、内存、磁盘三大方面&#xff0c;基本覆盖了常见的资源配额和使用量控制。Caroup 是ControlGroups的缩写&#xff0c;是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源…

报表生成器FastReport .Net用户指南: 显示表达式

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

Tomcat的安装与使用,Maven与Servlet的使用

文章目录 一.Tomcat的下载与使用1. Tomcat简介2. 安装和使用 二.Maven的使用三.Servlet1. 第一个Servlet程序2. 在idea中集成Tomcat3. 常见错误 一.Tomcat的下载与使用 1. Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目, 由…

学习Kafka生产者的缓冲池设计

大家一定都了解Java的线程池&#xff0c;线程池有什么好处呢&#xff1f;如果没有线程池&#xff0c;我们每次创建线程都要新建一个线程&#xff0c;这样对CPU的消耗比较大。那么利用线程池我们可以对已经创建好的线程复用&#xff0c;线程就不用频繁创建和销毁了。 同样&…

回顾 | Semantic Kernel:面向 AI 编程(三) - 云原生

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

chatgpt赋能python:Python如何创建角色

Python如何创建角色 在游戏开发中&#xff0c;创建角色是非常重要的一个环节&#xff0c;也是游戏设计的重要一环。Python作为一种广泛使用的编程语言&#xff0c;可以用于快速且高效地创建角色。 1. 创建角色的基本思路 创建角色的主要思路是定义角色的属性&#xff0c;包括…

ReactJS入门(一)—— 初步认识React

React刚开始红的时候&#xff0c;由于对其不甚了解&#xff0c;觉得JSX的写法略非主流&#xff0c;故一直没打算将其应用在项目上&#xff0c;随着身边大神们的科普&#xff0c;才后知后觉是个好东西。 好在哪里呢&#xff1f;个人拙见&#xff0c;有俩点&#xff1a; 1. 虚拟…

14.数据结构之多路查找树与堆

前言 之前介绍的都是二叉查找树&#xff0c;二叉树一个节点最多有两个子节点&#xff0c;那么多于两个节点是什么情况呢&#xff0c;这就是我们本节要介绍的多路查找树。 多路查找树&#xff0c;也是我们数据库mysql底层索引维护方式。下面&#xff0c;我们来详细介绍。 1. …

小红书母婴博主类型怎么选,类型区分

母婴类型的分享不管在哪个平台都是涨粉最快的&#xff0c;也可能是因为当前的大环境因素导致的。不过如果你想成为一名母婴博主或者想要借助它的影响&#xff0c;得先了解一些东西。那么小红书母婴博主类型怎么选&#xff0c;类型怎么区分。 小红书母婴博主是指聚集在小红书平台…

【数据结构】带你玩转排序:堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 常见算法的实现 插入排序 希尔排序 堆排序 选择排序 冒泡排序 快速排序 Hoare版本 随机选Keyi 三数取中 挖坑法 前后指针版本 归并排序 常见算法的实现 插入排序 动画演示&…

信创提速,人才为先!麒麟信安与领路信创签订《人才合作协议》

5月23日&#xff0c;麒麟信安杨涛董事长一行考察了设立在长沙领路信创科技有限公司&#xff08;简称&#xff1a;领路信创&#xff09;的“国家新一代自主安全计算系统产业集群人才基地”&#xff08;简称人才基地&#xff09;&#xff0c;并与领路信创刘耿董事长签署《人才合作…

苹果WWDC2023:首款MR头显震撼发布,开发者泪洒现场,一文读懂全新产品及创新功能

&#x1f337; 博主 libin9iOak带您 Go to New World.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《IDEA开发…

macOS Sonoma 发布,全面提升生产力和创意工作流(ISO、IPSW、PKG 下载)

macOS Sonoma 14.0 Beta 1 (23A5257q) ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Li…

chatgpt赋能python:Python如何删除行:从入门到精通

Python如何删除行&#xff1a;从入门到精通 在Python编程中&#xff0c;删除行是必不可少的操作之一。无论是清除不必要的数据&#xff0c;还是在数据集中删除重复行&#xff0c;或者在文本文件中删除某些行&#xff0c;删除行都是一项极其重要的任务。 什么是Python语言&…

shell文件读取

文件读取 一、whilefor shell中读取文件有两种方式 while 和 for while #!/bin/bash cat filename | while read line doetho $line donefor #!/bin/bash for line in cat filename(待读取的文件) doecho $line done第三中写法&#xff0c;上述两种方式的升级写法 #!/bin/bas…

SQL-约束

SQL-约束 1.1 概念 约束是作用于表中列上的规则&#xff0c;用于限制加入表的数据约束的存在保证了数据库中数据的正确性、有效性和完整性 1.2 分类 类型描述关键字非空约束保证列中所有的数据不能有null值NOT NULL唯一约束保证列中所有数据各不相同UNIQUE主键约束主键是一行…

HTTP首部(上)

HTTP 协议的请求和响应报文中必定包含 HTTP 首部&#xff0c;只是我们平时在使用 Web 的过程中感受不到它。本章我们一起来学习 HTTP 首部的结构&#xff0c;以及首部中各字段的用法。 1.HTTP报文首部 先来看看http报文的首部结构图&#xff1a; HTTP 协议的请求和响应报文中…

不知道如何搭建帮助中心?这里有解决办法!

在今天的数字化时代&#xff0c;帮助中心已经成为许多公司所必需的一个重要部分。它是一个客户与公司沟通和交互的重要渠道&#xff0c;可以帮助客户解决问题和获得支持。本文将介绍如何搭建一个有效的帮助中心&#xff0c;以提高客户满意度和公司的效率。 一、明确帮助中心的…

哪些因素对会影响到企业制定自己的融合CDN战略

我们知道一个企业/组织有多种方法可以实现和利用多CDN战略&#xff0c;由于带宽承诺、成本、超期费用等因素&#xff0c;因此对不同的指标进行评估至关重要。 以下是可能影响您的融合CDN战略的一些因素&#xff1a; 地理因素 在选择CDN时需要考虑的一个重要因素是用户所在的…