首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么要从.o创建.a文件进行静态链接?

为什么从 .o 文件创建 .a 文件进行静态链接?

.o 文件创建 .a 文件进行静态链接有以下几个原因:

  1. 代码优化:通过将多个 .o 文件链接到一起,可以减少可执行文件的大小,提高代码加载速度。
  2. 避免符号重复:静态链接将多个 .o 文件中的符号组合到一个 .a 文件中,从而避免了符号的重复,减少了库的体积。
  3. 提高可移植性:静态链接使得库可以在不同的编译器和平台上使用,提高了代码的可移植性。
  4. 便于调试:静态链接使得调试过程更加简单,因为代码和调试器可以直接与库进行交互,而不需要链接器介入。
  5. 避免动态链接:静态链接避免了在运行时加载库文件,从而避免了动态链接所带来的额外开销和内存占用。

创建 .a 文件进行静态链接,需要遵循以下步骤:

  1. 创建 .o 文件:对于每个源文件,使用 gcc 或其他适用的编译器将其编译为 .o 文件。
  2. 创建库文件:使用 ar 命令创建库文件。例如,要创建一个名为 my_library 的库,并将三个 .o 文件链接到一起,可以运行以下命令:ar rcs my_library.a foo.o bar.o baz.o其中 foo.obar.obaz.o 是源文件的名称。
  3. 使用静态库:在链接阶段,使用 ld 命令将 .o 文件和相应的库文件链接到一起。例如,要将一个名为 my_executable 的程序与 my_library.a 静态库链接到一起,可以运行以下命令:gcc -o my_executable -L. my_executable.c my_library.a其中 my_executable.c 是源文件的名称,-L. 表示库文件位于当前目录。

这就是从 .o 文件创建 .a 文件进行静态链接的基本过程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】软硬链接与动静态

这里有一点需要注意:我们可以给普通文件创建链接,但不能给目录文件创建链接,因为假如能给目录文件建立硬链接,就容易发生环路路径问题。  ...因此,可以这么来说:库文件中提供函数的实现方法,而头文件中提供函数说明。两者配套使用。实际上,库其实就是大量方法文件形成的.o文件的集合。 为什么要存在库?...(gcc -c) 将所有的.o文件使用ar -rc指令,进行打包形成静态库。...对于静态库的使用,还有第二种方法如下: 第二种方式使用静态库:将头文件以及库文件安装在系统目录 由于gcc/g++在编译时,会默认去系统目录搜索,进行路径匹配,这也是为什么我们平常用c/c++标准库时,...动静态链接的原理 为什么静态链接生成的可执行程序,不会依赖库文件呢?

19230

C语言 | 什么是静态链接库和动态链接库?

今天分享的是静态链接库和动态链接库的相关知识,并且自己动手写一个简单的静态函数库和动态函数库,来体验这个流程。 首先要从函数库的发明开始说起。...但是为什么包含这个头文件就可以使用里面的函数呢?...静态库其实就是商业公司将自己的函数库源代码经过只编译不链接形成.o的目标文件,然后用ar工具将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接文件)。...#define __test_H int add(int a,int b); #endif 接下来使用gcc -c只编译不连接,生成.o文件;然后使用ar工具进行打包成.a归档文件库名不能随便乱起...这个.a文件就是静态文件,lib后面的是库文件名称。制作出来了静态库之后,发布时只需要发布.a文件和.h文件。以上就是静态链接库的制作过程。

4.3K40

文件系统

x权限,因为用户要进入目录 如果用户要想在该目录下创建文集或者目录,就需要拥有w权限,因为目录的数据区要进行写入新建的文件名或者目录名。 下面有三个问题: 创建文件,系统做了什么?...思考——为什么下载软件比卸载慢呢? 因为下载是真实的把数据写到磁盘中,而卸载只要把inode和数据直接的链接断开就可以,不需要把数据清空,再次下载其他软件的时候,只需要进行数据的覆盖就可以。...硬链接 命令:ln 原始文件路径 硬链接文件路径 硬链接没有独立的inode,硬链接创建文件并不是真正意义上的文件,它主要就是在指定的目录下创建了一个映射而已。...用gcc命令对.o文件进行打包生成动态库。...gcc -shared 由上一步生成的.o文件 -o 动态库 上面我们就制作好了动态库。 gcc默认是链接的动态库。 如果我们直接按照静态库的方法进行运行,发现不可以运行成功。

50220

深入浅出动静态

✈️硬链接   首先,创建一个硬链接文件,我们使用如下命令来创建链接文件: ln file.txt link.hard#硬链接   同样,我们查看文件的inode号,可以发现:   从硬链接的inode...除此之外,我们还 可以给目录文件创建链接 方式: 硬链接应用场景   我们来看一个现象:   我们创建了一个空目录,但是为何这个空目录文件有两个硬链接数?   ...实际上,库 其实就是 将所有的 .o 文件用特定的方式进行打包,形成一个文件!   那么打包的这些文件能现main.c的main.o文件吗?...#将.o文件编译打包为静态库 -rc(replace && create) 选项表示 替换或创建 的意思。   ...当我们不使用-static选项且 没有动态库时,可执行程序也没有办法,只能对库进行静态链接,但程序不一定整体是静态链接的!但是反过来,我们只提供动态库,非得让程序进行静态链接就会报错!

10810

c语言里面静态链接库的制作和使用

静态库其实就是商业公司将自己的函数库源代码经过只编译不连接形成.o的目标文件,然后用ar工具(这个工具暂时自身没有使用过)将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接文件)。...静态链接库的制作和使用 1.自己制作静态链接库: 这里我先在当前目录创建两个文件一个是hell.c ,另外一个是hell.h,然后在hell.c里面写上;  #include   void...文件来记录生成静态链接库的过程,这个文件里面写: all:        gcc hell.c  -o  hell.o  -c        ar  -rc  libhell.a  hell.o...说明: 首先使用gcc -c只编译不连接,生成.o文件;然后使用ar工具进行打包成.a归档文件。...  libhell.a  Makefile 2.使用静态链接库: 上面创建好了静态链接库,现在我们就来使用这个静态链接库,然后我在当前目录下再创建一个目录叫做testlib,然后把hell.h和libhell.a

1.4K30

【Linux】动静态

一.什么是库 简单来说:库是一些可重定向的二进制文件,这些文件链接时可以与其他的可重定向的二进制文件一起链接形成可执行程序。 一般来说库被分为静态库和动态库,他们是有不同的后缀来进行区分的。...2、编译:将预处理后的文件转换成汇编语言,生成.s文件 3、汇编:汇编变为目标代码(机器代码)生成.o文件。 4、链接:连接目标代码,生成可执行程序。在链接之前,各个头文件都是独立进行编译的。...首先,我们形成一个共识: 在库文件中,是不会存在main函数的。 在链接之前各个文件都是独立进行编译的,然后拿着形成的“.o文件进行链接。 接着:我们试着实现一个库。...准备工作完成,接下来,正式开始: 3.1静态库和静态链接 为了方便一些,我们创建一个makefile 我们直接把这个归档形成的文件给使用者,使用者就可以使用了吗?不好意思,不可以。...方案二 对配置文件进行修改 该文件夹下保存着相关的搜索信息,我们可以创建任意名称的文件,然后将动态库路径写入文件中即可。

7310

【Linux】磁盘结构文件系统软硬链接静态

(这也是为什么 cd … 能够回退到上级目录的原因,因为… 是上级目录的一个别名) 注:Linux 不允许用户给目录创建链接,只能系统自己创建 (....---- 四、静动态库 1、什么是动静态库 我在之前的博客中已经对动静态库以及动静态链接进行了基本的介绍 – 链接方式与函数库,这里就直接总结一下: 静态库 (.a):程序在编译链接的时候把库的代码链接...静态库的制作 制作静态库就是将多个 .o 文件打包到一个文件中,所以我们可以使用 Linux 中的归档工具 ar (rc : replace and create): 注:我们最好将生成 .o 文件以及归档...yum的资源中供别人进行下载使用了: 静态库的使用 静态库的使用首先需要从 yum 源或者其他地方将软件包下载下来,我们自己制作的直接 cp 然后解压即可: 然后,我们在进行 gcc 编译汇编时需要通过...而静态链接是在多个可重定向文件进行链接时直接将静态库中的代码拷贝到代码段中,最终形成可执行程序;那么后面程序运行时将对应数据加载到虚拟内存的对应区域、建立页表映射、执行代码等系列过程与静态库就完全无关了

1.2K00

Linux基础IO【软硬链接与动静态库】

链接并非创建一个相同的文件进行链接,而是在源文件所目录下的 【inode编号 与文件名对应表中】,新增 【inode 编号与硬链接文件名】的映射关系,并将 inode 结构体中的引用计数 +1,表示当前已成功硬链接上了一个文件...,硬链接文件不受任何影响,仅仅只是 硬链接数 - 1,同理,删除硬链接文件,也不会影响源文件 为什么新建目录的硬链接数为 2?...静态库的打包主要分为以下两步: 将源文件进行 预处理->编译->汇编,生成可链接的二进制 .o 文件 通过指令将 .o 文件打包为静态库 将文件编译为 .o 二进制文件 gcc -c myadd.c...我们还可以使用 ar 反向查看静态库中的具体文件 ar -tv 静态文件 获得静态库后,就可以进行使用了 注:此时的 .h、.c、.o 文件位于 myinclude 文件夹中,而静态文件...*.c 将所有的 .o 文件打包为动态库(借助 gcc/g++) gcc -o libmycalc.so *.o -shared 获得静态库后,就可以进行使用了 注:此时的 .h、.c、.o

27120

【Linux】静态库和动态库

Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...让用户用我们提供的.o文件进行链接即可。在编译时,只要把源文件编译成.o文件在将其链接便可形成一个可执行的程序: 通过gcc -o生成,不出意外,编译运行成功: 难道就这么简单吗?...我们可以站在编写库的角度和使用者的角度来制作: 编写库:创建Makefile: 将文件编译成.o文件 ar命令:把所有的.o打包起来,ar是归档。.../etc/ld.so.conf.d/,ldconfig更新 4.创建链接 ---- 五、动静态库的加载 静态库不需要加载,静态库把代码拷贝到可执行程序里,直接决定了当加载的时候在内存里代码和数据可能存在多份

26830

Linux文件系统

这就是为什么在一个目录下创建一个文件为什么要有写权限和读权限了,因为创建文件代表需要向这个目录中写入inode与文件名,读取目录下的文件需要去找当前目录的文件名才可以找到对应的inode。...文件与引用计数 我们创建一个普通文件和目录,普通文件是一有一个硬链接的,因为文件名和它的inoded是映射关系。 那么为什么目录又两个呢?...什么是库 首先创建三个文件:add.h add.c main.c 这一步将add.c和main.c进行了汇编,就差链接了,add.o和main.o里面都是二进制。...但是如果.o文件太多了怎么办?那么我们可以将.o文件尝试打包,给对方提供一个库文件即可。 所以,库就是多个.o文件打包成一个文件,然后分为静态库和动态库。...库的本质就是多个.o文件的集合 库的使用 静态库 那么我们如何来打包呢? add.c是加法实现方法,sub.c是减法实现方法。 用ar -rc选项去进行打包。

12.6K00

【Linux】静态库和动态库

所以一般情况下对于这种多文件项目时,要先把源文件编译成 .o 文件,然后再把所有的 .o 文件进行链接,形成可执行程序!...所以我们先创建一个 Makefile,进行对上面的实践: 如上图,我们解释一下各项的作用。...;选项 -rc 代表如果 .o 文件存在则替换,不存在则创建。...(2)对静态库打包 下面我们对静态库和头文件分别进行打包,对 Makefile 进行修改,如下: static_lib=libmylib.a $(static_lib):Add.o...我们将所有的头文件给到用户: 还需要将对应的静态库给到用户: 如上,我们对应的头文件静态库都有了,所以我们尝试编译一下: 我们发现出现了链接错误,这是为什么呢?

41510

【Linux修炼】14.磁盘结构文件系统软硬链接静态

因此实际上这两个都是同一个文件,那为什么一个文件有两个名字?...如果目录要创建链接的话,那么它的子目录以及子文件都要创建相应的硬链接,这无疑带来了很大的局限, 如果一个目录下有着很多的内容,那么一个硬链接创建将会是无法想象的,可以说对应目录下的每个内容都要与源目录下的每个内容创建相应的硬链接...这个时候问题来了,为什么平时我们写代码的时候不需要跟上静态库的位置呢?...code)】 想要将全部的.o文件打包,也与静态库有所不同,同样多了一个选项:shared【表示生成共享库格式】即:gcc -shared -o libmymath.so my_sub.o my_add.o....o 文件的真正地址,而是该 .o 文件在动态库中的偏移量;(与C++中的虚函数表一样) 然后就是程序运行的过程:操作系统会将磁盘中的可执行程序加载到物理内存中,然后创建 mm_struct,建立页表映射

1.1K00

python 调用c语言详解

python语言调用c语言进行扩展,或者增加程序的运行速度都是特别方便的。同时还能获得与C或者C++几乎相同的执行性能。...Python调用C语言的方式 CTYPES, SWIG, BOOST.PYTHON, CYTHON python是解释型语言,只能调用c的动态链接库。 那什么是库,什么是静态库与动态库?...库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 静态库与动态库的区别 静态库与动态库的区别主要是在链接阶段,分别称为静态链接方式与动态链接方式。...静态库是链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入 为什么需要动态库?...创建动态库与静态静态库 生成.o文件 g++ -c StaticMath.cpp 生成.a文件 ar -crv libstaticmath.a StaticMath.o 动态库 For Linux

3.4K50

Linux库详解

实际开发中我们所编写的程序需要依赖很多基础的底层库,因此库的存在有很大的意义,避免每次编码都要从头开始 本质上库是可执行代码的二进制形式,这个文件可以在编译时由编译器直接链接到可执行程序中,也可以在运行时根据需要动态加载到内存中...库的种类 为了便于理解,将程序库可以分为三种类型:静态库、共享库和动态加载(DL)库 2.1 静态库 Linux下静态库以.a结尾的库文件 静态库实际上是一些目标文件的集合,在生成可执行文件阶段进行链接...Linux下编译源码时源文件经过编译生成.o的目标文件,.o的目标文件链接阶段经过链接生成可执行程序。...所以在链接阶段可以链接.o的目标文件,也可以把所有.o的目标文件进行打包,统一进行链接,因此打包.o文件生成的文件,就是静态库。...Linux下库文件制作 本节只针对Linux下库的概念及分类做详细阐述,下一节将详细讲解如何通过程序创建属于我们自己的库文件,包括创建静态库、共享库、动态加载库的实现等

2K40

Linux开发工具——gcc篇

gcc -E xxx.c -o xxx.i#将原文件进行预处理,为了得到预处理后的文件,我们加上“-o”选项,得到目标文件   创建一个C的源文件:   对该文件进行编写:   将该文件进行预处理得到目标文件...gcc xxx.o -o xxx#将目标文件进行链接,称为可执行文件   其中在链接的过程中,会把.o文件与库文件进行链接的。...✈️ 动静态库   我们在使用gcc进行编译的最后一步链接时,会按照系统默认路径 “user/lib” 下进行查找,也就是生成的 .o 文件与库文件 libc.so.6 进行链接。   ...静态库的工作状态: 1、在编译时,静态库的目标文件(.o文件)会被链接到可执行文件中。...2、静态库的函数和数据在可执行文件中是静态的,与.o文件进行 静态链接 3、静态库的大小会增加可执行文件的大小,因为库的代码会被完整地复制到可执行文件中。

16010

【Linux】编译器-gccg++使用

如果想要重新做一遍前面的预处理再到编译,那么就用.c文件 gcc -S test.c -o test.s 如果想要从预处理阶段直接编译就用.i: gcc -S test.i -o test.s 这里发现报错...3.3 汇编 汇编:将汇编语言翻译为二进制目标文件,这种二进制是没有办法指向的,还差一个链接。 -c:从现在开始进行程序的汇编,汇编完成就停下来。...因为Linux存在这两种库,就决定了,在链接时,有两种方式:动态链接静态链接。...查看文件类型: file my.exe 使用的是动态库链接: 动态库和动态链接的优缺点: 不能丢失 节约资源 重新创建一个文件夹,把test.c移动到里面,然后执行。...静态库和静态链接的优缺点: 一旦形成,与库无关 浪费资源 形成静态链接: gcc -o mytest-static test.c -static - 发现报错了: 这个是因为在默认情况下,一般静态库都是默认没有安装的

14710

开篇:预备知识---2

动态库和静态库 ​ 在上面我们已经成功的创建并使用了我们自己的库(libcustom.a)。为什么我要将库文件命名为 libcustom.a 呢?这其实和库文件的种类和命名标准有关。...我们可以通过 GCC 来创建动态链接文件,为了方便,这里直接使用上文中得到的两个 .o 文件(custom1.o 和 custom2.o进行操作。...这里我们先暂且记下,待会和使用静态链接库生成的可执行文件进行一个对比。 好了,这里我们成功的创建并使用了动态链接库。这个动态链接库不仅可以给我们用,还可以提供给运行在其他相同操作系统的程序中使用。...(Linux 系统),当链接文件夹中不存在动态链接文件时,才使用静态文件,你也可以在编译命令中加入 -static 参数来禁止 GCC 使用动态库进行链接,这时 GCC 只会使用静态库来进行链接,...在我们之后在进行创建链接文件时应该遵循这种命名规则,这样我们创建的库文件才具有通用性。

75620

【Linux】从零开始认识动静态库 - 静态

3 建立静态库 我们来谈谈如何建立静态库。 3.1 背景知识 首先我们创建几个头文件和对应的函数实现: 我们现在有两套方法。...,这一编译可就出事了: 舍友蒙了,为什么提示找不到对应函数,不是提供了对应的文件了吗?...这时你来解围:因为编译链接的时候需要把.o文件也一起进行: 这下就可以了!!!运行也正常!!! 成功了!!...总结: 头文件是一个手册 , 提供函数的声明,告诉客户怎么使用 .o文件提供实现,我们只需要补上一个main,调用头文件提供的方法,然后与.o进行链接,就可以形成可执行文件!!!...这个静态库如何使用呢? 通过命令 ar -rc libmyc.a *.o 就可以创建一个静态库 于是你就发给了舍友: 然后继续编译链接就可以了: 这样就好了!!!

12110

c++动态库和静态库的区别_静态库里面包含动态库

回顾一下,将一个程序编译成可执行程序的步骤: 图:编译过程 静态库 之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。...因此对应的链接方式称为静态链接。 试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。...其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件静态库特点总结: l 静态库对函数库的链接是放在编译时期完成的。...创建静态库(.a) 通过上面的流程可以知道,Linux创建静态库过程如下: l 首先,将代码文件编译成目标文件.o(StaticMath.o) g++ -c StaticMath.cpp 注意带参数...动态库 通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢? 为什么还需要动态库? 为什么需要动态库,其实也是静态库的特点导致。

1.7K30

制作动态framework与静态framework的那些坑

为什么? 对于此时的动态库来说,是在需要是动态载入的 ?...其实这些资源文件都是在我们的动态库中,我们需要从动态库中去加载他们 那么怎么来获取动态库,那当然是动态获取啦 //自定义framework Mach-O Type 为 dynamic 的时候bundle...好了,动态库基本就这些,下面就是静态库啦 2 static library 配置大致与上面类似只是Mac-O Type 选择了static library 首先我们要说一下静态库的加载,它会在App...启动是伴随着加载, 其次 太会被放置到App的包中也就是我们ipa文件的Payload里面 我们主要说不同点: 1 图片 plist等资源加载 我们可以将这些依赖的资源文件制作为bundle(简单制作就是创建文件夹...此时运行的话我们的例子会报错需要进行下面的配置 ?

2K20
领券