动静态库

动静态库介绍

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

静态库

通常以.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。

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

相关推荐
薛之谦_10 小时前
Java 整合 RocketMQ 实战:从入门到复杂场景落地
java·rocketmq·java-rocketmq
jyOverQ11 小时前
从零开始学 RocketMQ(四):集群部署、消息存储与高可用【保姆级教程】
java·rocketmq·java-rocketmq
Msshu1235 天前
PD快充诱骗取电芯片工作原理,XSP17诱骗取电5V9V12V15V20V功能测试
spring boot·spring cloud·sentinel·java-rocketmq·java-zookeeper·java-consul·java-activemq
jyOverQ7 天前
从零开始学 RocketMQ(一):基础概念、环境搭建与简单消息收发【保姆级教程】
java·rocketmq·java-rocketmq
做个文艺程序员11 天前
MQ第04篇:ActiveMQ深度解析:JMS规范、Spring JMS整合与企业级异步通信实战
spring·消息队列·activemq·java-activemq·jms
MayBaymax17 天前
MQ 基础概念与架构
java·中间件·架构·java-rocketmq
卷毛的技术笔记1 个月前
RocketMQ事务消息:我把分布式事务这层窗户纸捅破了
java·分布式·后端·java-rocketmq
xbgRS2 个月前
RocketMQ消费者消息获取
java·rocketmq·java-rocketmq
骇客野人2 个月前
SpringBoot + RocketMQ 异步解耦与最终一致性解决方案
spring boot·rocketmq·java-rocketmq
典典分享指南2 个月前
Python-docx 批量生成带图营销文:文字图片分离与排版定位
servlet·intellij-idea·java-consul·java-activemq