CSAPP静态库_csapp库-程序员宅基地

技术标签: CSAPP博客  

静态库

其实这里大部分讲的来源于CSAPP,挠头。

所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,成为static library——静态库

相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件。然后应用程序可以通过在命令行上指定的单独的文件名字来时用这些在库中定义的函数。

在链接时,链接器将只复制程序引用的目标模块:
1.减少了可执行文件在磁盘和内存中的大小。
2.应用程序员只需要包含较少的库文件的名字(C compiler驱动程序总是传送给libc.a)

在Linux系统中,静态库以一种成为存档(archive)的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部来描述每个成员目标文件的大小和位置。后缀为.a

看一个例子:

/* addvec.c */
/* $begin addvec */
int addcnt = 0;

void addvec(int *x, int *y,
	    int *z, int n) 
{
    
    int i;

    addcnt++;

    for (i = 0; i < n; i++)
	z[i] = x[i] + y[i];
}
/* $end addvec */
/* multvec.c */
/* $begin multvec */
int multcnt = 0;

void multvec(int *x, int *y, 
	     int *z, int n) 
{
    
    int i;

    multcnt++;

    for (i = 0; i < n; i++)
	z[i] = x[i] * y[i];
}
/* $end multvec */

头文件:vector.h定义了静态库中例程的函数原型

/* prototypes for libvector */
void addvec(int *x, int *y, int *z, int n);
void multvec(int *x, int *y, int *z, int n);
int getcount();
/* main2.c */
/* $begin main2 */
#include <stdio.h>
#include "vector.h"

int x[2] = {
    1, 2};
int y[2] = {
    3, 4};
int z[2];

int main() 
{
    
    addvec(x, y, z, 2);
    printf("z = [%d %d]\n", z[0], z[1]);
    return 0;
}
/* $end main2 */

以上是用到的代码。
讲一下与静态库有关的指令

linux> gcc -c addvec.c multvec.c
linux> ar rcs libvector.a addvec.o multvec.o

生成相关的.o文件,使用AR工具将可重定位目标文件连接起来。
在这里插入图片描述
然后运行中间一定要把静态库写在最后面

linux> gcc -c main2.c
linux> gcc -static -o prog2c main2.o ./libvector.a

或者使用

linux> gcc -c main2.c
linux> gcc -static -o prog2c main2.o -L. -lvector
-static参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,可以加载到内存并运行,在加载时无需更进一步的链接。
-lvector参数是libvector.a的缩写,-L.参数告诉链接器在当前目录下查找libvector.a

在这里插入图片描述
当然除了这里显示的链接了libvector.a以外,程序自动会链接libc.a静态库。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43329358/article/details/103107398

智能推荐

iphone:自定义UIAlertView-程序员宅基地

文章浏览阅读208次。由于项目中有这样一个需求:需要在保存是弹出框选择保存的地点。选择UIAlertView来实现,但是要在UIAlertView中增加UISwitch的控件,这就需要自定义一个继承UIAlertView的类来自定义UIAlertView了。实现效果如下:(还没加图的)我需要在点击确定的时候,知道两个Switch的状态,才能进一步做相应的功能。自定义了SaveAlertView类。在..._自定义uialert

解决R/RStudio中安装包“无法与服务器建立连接”_trying url-程序员宅基地

文章浏览阅读6.8w次,点赞27次,收藏69次。这几天在用RStudio写程序的时候突然出现无法从网络直接安装r包的问题,也无法从本地直接安装。通过多方尝试找到了问题解决的办法,现在记录在这里。程序报错如下:   > install.packages('REmap')Warning in install.packages : unable to access index for repository https://cran.rstud_trying url

Python2 变量类型_python2 获取变量的类型-程序员宅基地

文章浏览阅读255次。变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。变量赋值Python 中的变量赋值不需要类型声明。每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:实例(_python2 获取变量的类型

Zabbix监控基础搭建以及在zbbix的web界面添加agent被监控端_zbagent 配置-程序员宅基地

文章浏览阅读736次。关于zabbixzabbix(音同 za:bix)是一个基于WEB界面的提供分布式系统监视以及网络 监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供 灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。zabbix由2部分构成,zabbix server与可选组件zabbix agent。zabbix的工作模式了解完了zabbix的..._zbagent 配置

String str = new String(“abc”),“abc”在内存中是怎么分配的?_"new string(\"abc\")在内存中怎么分配"-程序员宅基地

文章浏览阅读7.6k次。堆、字符串常量区什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。实现前提 字符串常量池实现的前提_"new string(\"abc\")在内存中怎么分配"

SDL编程入门(21)音效和音乐_mix_chunk-程序员宅基地

文章浏览阅读958次,点赞4次,收藏7次。音效和音乐到目前为止,我们只是在处理视频和输入。大多数游戏制作都需要某种声音,这里我们将使用SDL_mixer为我们播放音频。//Using SDL, SDL_image, SDL_mixer, standard IO, and strings#include <SDL.h>#include <SDL_image.h>#include <SDL_mixer.h>#include <stdio.h>#include <string>_mix_chunk

随便推点

linux磁盘挂载之parted_parted /dev/sdb-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏22次。因为fdisk命令支持的最大分区容量为2T如果需要挂载大容量的分区磁盘需要使用parted命令。_parted /dev/sdb

全网最全!QCC514x-QCC304x(Headset)系列从入门到精通开发教程汇总(持续更新中)_qcc3044 headset-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏18次。详细记录分析QCC304x(对于QCC514X同样适用),sdk解析,帮助你快速部署开发项目。教程没完结前,不定时持续更新,包括新发布文章和对已发布的补充更新。有问题,欢迎私聊讨论,希望可以帮到您。由于博主水平有限,教程中难免有不正确的地方, 不深入的地方,欢迎指正。欢迎关注公众号,更多信息等你来看版本 说明 ADK ADK_Toolkit.WIN.1.2 Installer_1.2.4.16 BlueSuite BlueSuite.WIN.3.3 .._qcc3044 headset

Android摄像头数据采集与处理_安卓用log抓摄像头信息-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏23次。android Camera2使用前言:由于有关camera2使用和对数据处理的比较少所以笔者也有着乐于助人心所以有了后面的内容。咋们废话不多说先把流程和目的说下。首先是获取到相关摄像头id、然后打开摄像、接收摄像头数据回调、将y、u、v拼接成完整的yuv、对数据进行旋转生成正常用户看到的画面,以及对yuv数据编码为h264数据。Camera2 API介绍1.获取前或者后置摄像..._安卓用log抓摄像头信息

vue 后台获取路由表,addRouters动态路由-程序员宅基地

文章浏览阅读3.6k次。近日公司要求管理端动态管理路由,在登录时从后端获取路由配置动态生成路由最大的bug出在,component属性运用import引入时,会找不到模块无论使用import或者require,在引入一个变量时,都无法找到该变量指向的模块路径routerItem.component = () =>import('后端返回的模块路径');后引入一个_import_devel..._vue提取后端传入的路由数据

mysql view 更新问题_mysql 视图实时更新是全表更新吗知乎-程序员宅基地

文章浏览阅读4.4k次。mysql view 更新问题 如果视图中包含 聚合函数 、使用临时表的 都不能更新_mysql 视图实时更新是全表更新吗知乎

IO(Java)-程序员宅基地

文章浏览阅读104次。IO一、IO分类1.1、总的分类1.2、按流向分类输入流​ 数据源到程序(InputStream、Reader读进来)输出流​ 程序到目的地(OutPutStream、Writer写出去)1.3、按功能分类节点流​ 可以直接从数据源或目的地读写数据。处理流​ 不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。1.4、按处理的数据单元字节流按照字节读取数据(InputStream、OutputStream)​ 字节流能够处理一切的内容,包括文本和非

推荐文章

热门文章

相关标签