动静态库

动静态库介绍

有时候我们需要使用别人编写的代码,或者别人需要使用你编写的代码,但是你不想把自己的源代码给它,这个时候我们只需要将我们的程序打包成为动静态库,然后把头文件给他告诉里面有哪些接口,他直接调用就行了

静态库

通常以.a为文件末尾,其中.a是(archive)的缩写,中文表示归档文件,这里为静态库的意思,它的特点是程序在编译的时候就会把程序拷贝到可执行程序中,运行的时候不再依赖这个静态库,即便你把它删除掉了都没有关系,缺点是会导致程序占用控件变大

动态库

通常以.so为文件结尾,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。因此如果程序在运行的时候如果没有这个动态库程序就运行不了

静态库的制作

静态库的使用

拷贝到系统中

这种方法需要我们将.h文件拷贝到/usr/include/目录下,将静态库拷贝到/lib64目录下

拷贝完成之后我们就可以直接使用了,但是后面我们在编译我们的程序的时候,需要在后面加上这样一句话 -l myFunc 表示需要链接这个静态库,注意这个静态库需要去掉前缀和后缀

拷贝到本地

这种方法和上一种方法没有太大的变化,只是生成可执行文件的时候有一点区别

在上面的方法中,我们需要将头文件和静态库拷贝到当前的路径下进行使用,编译的时候还需要指明让编译器去那个路径下面去找静态库

下面我们通过编写makefile文件的方式来为我们的静态库进行输出到指定的目录下面去

cpp 复制代码
libmyFunc.a:helloworld.o comeon.o
  2         ar -rc $@ $^
  3 %.o:%.c
  4         gcc -c $<
  5 
  6 .PHONY:clean
  7 clean:
  8         rm -fr *.a *.o stdc
  9 
 10 .PHONY:output
 11 output:
 12         mkdir -p stdc/include
 13         mkdir -p stdc/lib
 14         cp -f ./*.h stdc/include
 15         cp -f ./*.a stdc/lib
 16         tar czf stdc.tgz stdc

这样就能生成一个stdc和stdc.tgz的文件和压缩包了

打包好了之后就可以将库交给别人了,但是现在在使用上还是有一些区别,下面我们来演示一下

动态库的使用

首先我们需要生成动态库

cpp 复制代码
libmyFunc.so:helloworld.o comeon.o
  2         gcc -o $@ $^ -shared
  3 %.o:%.c
  4         gcc -fPIC -c $<
  5 
  6 .PHONY:clean
  7 clean:
  8         rm -rf *.so *.o stdc*
  9 
 10 .PHONY:output
 11 output:
 12         mkdir -p stdc/include
 13         mkdir -p stdc/lib
 14         cp -f *.h stdc/include
 15         cp -f *.so stdc/lib
 16         tar -czf stdc.tgz stdc

其中,上面的-shared表示要生成共享格式,-fPIC表示产生位置无关码

生成之后我们需要使用,但是使用方法和静态库是有区别的,其中第一种将文件拷贝到系统中和静态库是一样的,但是拷贝到本地还是有区别的

我们通过查看当前可执行文件的依赖文件,发现找不到动态库,这是因为程序在运行的时候系统需要在默认路径下去找动态库,但是在/lib64下根本没有这个东西,这个时候除了将将动态库拷贝到/lib64目录下,还可以建立软链接

这个时候我们就能发现能够找到动态库了

还有一种方法就是将当前的库目录添加到LD_LIBRARY_PATH中

注意如果同时提供动动态库和静态库,系统会默认使用动态库,如果想要使用静态库,需要在后面加上-static。

如果需要强制链接静态库,必须提供静态库,反之,如果链接的是动态库,但是没有动态库,系统会找静态库

相关推荐
超梦dasgg3 天前
Java 生产环境 RocketMQ 架构与部署指南
java·rocketmq·java-rocketmq
超梦dasgg7 天前
Java 生产环境 MQ 技术选型全解析
java·开发语言·java-rocketmq·java-rabbitmq
电魂泡哥8 天前
RocketMQ Dledger 集群与 Raft 协议
java·rocketmq·java-rocketmq
武子康9 天前
Java-219 RocketMQ Spring Boot 集成指南:生产者与消费者实战
java·spring boot·分布式·kafka·消息队列·rocketmq·java-rocketmq
武子康10 天前
Java-221 RocketMQ 消息存储核心原理:CommitLog、ConsumerQueue、IndexFile 与消息过滤机制
java·大数据·分布式·消息队列·rabbitmq·rocketmq·java-rocketmq
Apache RocketMQ12 天前
RocketMQ 源码解析——Controller 高可用切换架构
架构·rocketmq·java-rocketmq
Apache RocketMQ12 天前
Apache RocketMQ 5.0 架构解析:如何基于云原生架构支撑多元化场景
云原生·架构·apache·rocketmq·java-rocketmq
Apache RocketMQ15 天前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq
苍煜24 天前
RocketMQ系列第三篇:Java原生基础使用实操,手把手写生产者消费者Demo
java·rocketmq·java-rocketmq