静态库链接

回到刚才我们的hello world 分析中,这个程序之所以有用,是因为有输出。也就是说把hello world 输出到屏幕上。

那么他是如何做到这一点的呢?最简单的办法 就是使用os 提供的应用程序编程接口。也就是api。

一般情况下,一种语言的开发环境往往会附带有 language library 就是语言库。这些库就是对操作系统的api的封装。

比如我们的hello world中 使用标准库的printf 来输出 hello world 这个文字信息,哪实际上 prinf 这个函数在对字符串做了

一些必要的处理之后,最后就会调用操作系统的api了。在linux中。就是调用的 write的系统调用。

当然了,c语言库里面 还有很多函数 是不需要调用系统api的  比如strlen()函数。

所以静态库可以简单的看成一组目标文件的集合。就是很多目标文件经过压缩打包以后形成的一个文件。

比如说 我们跑到 ubuntu下面的usr/lib 目录下面 输入命令

ls -l *.a

实际上这个.a 就是一个ubuntu下面重要的静态库。 我们用ar -t 分析它 发现这个里面 实际上包含了若干的.o文件。

当然了实际上 在现在的ubuntu中 很多时候都是动态加载了。比如我们的hello world程序

这些so库就是动态链接库。

时间: 2024-08-03 21:49:48

静态库链接的相关文章

静态库链接时的依赖关系和先后顺序

1 静态库链接时的依赖关系 静态库之间是有依赖关系的,比如A.lib依赖于B.lib.C.lib.D.lib.E.lib,因为A会使用B.C.D.E中的函数. 2 使用静态库时的先后顺序 是不是B.C.D.E一定要放在A的后面?或者说,如果自己依赖于某个库,那么自己就要放在这个库的后面? 如果是的话,为什么会这样?是所有的链接器都是这样的吗? MSVC++12.0编译器是不管这个顺序的,gcc的未知. 3 使用静态库时必须注意依赖关系 也就是说,要使用一个lib时,要把它依赖的所有的lib都加上

浅析静态库链接原理

静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方.本文简要描述linux下静态库在链接过程中的一些细节. 静态库文件格式 静态库远远不同于动态库,不涉及到符号重定位之类的问题.静态库本质上只是将一堆目标文件进行打包而已.静态库没有标准,不同的linux下都会有些细微的差别.大致的格式wiki上描述的较清楚: Global header ----------------- +------------------------------- File header 1 --->

gcc将多个静态库链接成一个静态库

参考:https://sourceware.org/binutils/docs/binutils/ar-scripts.html#ar-scripts makefile如下: 1 ARSCRIPT=script.ar 2 SILENT=@ 3 ARCHIVES=$(wildcard $(DIR_LIB)/*.a) 4 5 $(LIB_TARGET):$(OBJ) 6 $(SILENT)echo "CREATE [email protected]" > $(DIR_OBJ)/$(A

VS编译linux项目生成静态库并在另一个项目中静态链接的方法

VS2017也推出很久了,在单位的时候写linux的服务端程序只能用vim,这让用惯了IDE的我很难受. 加上想自己撸一套linux上的轮子,决定用VS开工远程编写调试linux程序. 在windows下编写静态库并在另一个项目中引用很简单 新建项目的时候选择静态库,进去把代码撸好,即可编译出静态库*.lib 随后在希望使用该静态库的项目中设置一下链接器"附加库目录"为"../Debug"(和你的输出路径有关),然后添加"附加依赖项"静态库名.l

C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

目录 0. 引言 1. 交叉编译 2. Cygwin简介 3. 静态库编译及使用 4. 动态库编译及使用 5. MinGW简介 6. CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统.为什么linux和unix之间有很多软件可以很轻松的移植?因为linux也满足POSIX规范,所以在运行机制上跟unix相近.同时,POSI

三种标准库链接方式

Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地工作和理想地运行.1.Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊.2.Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题.全静态:1.-static -pthread -lrt -ldl2.不会发生应用程序在 不同 Linux 版本下的标准库不兼容问

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

【转】Linux下gcc生成和使用静态库和动态库详解

一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者的库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可

静态库 动态库

1,存在形式 静态库: .a 和 .framework; 动态库: .dylib 和 .framework; 2. 使用 静态库: 链接时,静态库会完整的复制到可执行文件中,被多次使用就会用多份冗余拷贝; -- (核心代码,将MRC打包成静态库,避免切换开发环境) 动态库: 链接时,不复制,程序运行时 由系统动态加载到内存, 供程序调用. [注意]: 静态库并不会将资源打包, 如果静态库中用到了其他的资源,必须手动导入.(一般将资源放入到.bundle文件中) 3. 报错 Undefined s