我们知道static静态函数相比于全局函数,会把范围限定在自己所在文件的范围,对其他的编译单元是不可见的!那么若在动态库中定义了static静态函数并完成库的编译,那么在主程序加载并试图调用这个static静态函数的时候会找不到它!因此需要在主程序中直接调用的函数在动态库中不要定义和声明为static类型!同样的问题也在stackoverflow有讨论:https://stackoverflow.com/questions/5526461/gcc-warning-function-used-but-n
生成
动态库
: 需要的目标文件得用-fPIC选项生成.
而
静态
库所需的目标文件可以不用-fPIC选项.
一个
应用
程序调用
动态库
, 而这个
动态库
其
中
的
函数
调用某
静态
库时,如何生成
应用
程序呢?
///////
static
.h
void
static
_print();
///////
static
.cpp
#include
#include "
static
.h"
void sta
静态
链接:
空间的浪费:
静态
链接,程序最后都
会
链接成一个可执行文件,那么功能相同的模块(可以用来共享),在每一个需要
使用
的程序
中
都有一个份,这样就
会
对计算机的内存和磁盘空间造成浪费。
更新、部署、发布困难:当需要更新功能相同的模块(可以用来共享)时,所有的程序需要重新连接。
动态链接:
不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。
节省空间,提供缓存命
中
率:在内
库文件是事先编译好的方法的合集。比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后
使用
只需要库文件就可以,不需要重新编写。
Linux
系统
中
:
1.
静态
库的扩展名为.a;
2.
动态库
的扩展名为.so;
源代码到可执行程序的转换时需要经历如下图所示的过程:
1.编译是指把用高级语言编写的程序转换成相应处理器的汇编语言程序的过程。
2.汇编是从汇编语言程序生成目标...
1.
静态
库和
动态库
有什么异同?
静态
库:链接时完整地拷贝至可执行文件
中
,被多次
使用
就有多份冗余拷贝。利用
静态
函数
库编译成的文件比较大,因为整个
函数
库的所有数据都
会
被整合进目标代码
中
,他的优点就显而易见了,即编译后的执行程序不需要外部的
函数
库支持,因为所有
使用
的
函数
都已经被编译进去了。当然这也
会
成为他的缺点,因为如果
静态
函数
库改变了,那么你的程序必须重新编译。
动态库
:链接时不复制,程
0. 基本
在命名上,
静态
库的名字一般是 libxxx.a,
动态库
的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本号,minor是副版本号。
linux
系统存放
函数
库的目录:/lib(/lib64),/usr/lib(/usr/lib64)lrwxrwxrwx. 1 root root 7 Sep 2
一、
静态
链接库
静态
链接库是obj文件的一个集合,通常
静态
链接库以".a"为后缀,名字格式一般为libxxx.a,由程序ar生成。
静态
链接库是在程序编译过程
中
链接的,已经将调用的相关
函数
拷贝到程序内部,程序运行时和
静态
链接库已经没有任何关系。
1、
静态
链接库的创建
A、编写源码库文件
源码库文件一般包含.c和.h文件,
hello.c文件:
#include <stdio.h>
void display(void)
printf("hello world\n")...
Linux
:解决
应用
程序/
动态库
中
与加载的其他
动态库
的
函数
重名
问题
今天客户提出来一个大
问题
,
Linux
版本的一段程序,显示正常的pdf在识别的时候,程序崩了,这个不应该啊。就算pdf是坏的,那也应该有错误码,而不应该崩掉啊。
在复现的过程
中
,gdb调试发现,在我们的
动态库
A.so
中有
个接口叫F_Recg(),我们调用的底层还有个用的别人提供的
动态库
B.so,其
中有
个
函数
也叫F_Re...
踩坑是为了更好的填坑
在日常的开发过程
中
,关于
静态
库和
动态库
,稍不注意,就
会
出现
问题
.不仅影响工作效率,当你的同事在
使用
你写的库的时候,还
会
出现各种让人看不懂的报错,进而怀疑你的编写水平.究其原因就是在编写库的时候,遗漏了一些配置步骤.在此我把这些错误列出来,如果以后关于库的
问题
报错,你可以来查看相关的报错信息.
关于库的简单介绍,更详细的请百度
库分为两大类
静态
库: .a
在C语言
中
,
static
关键字有多重作用。在
变量
的声明
中
,它可以用来限定
变量
的作用域,使得
变量
仅在当前文件
中
可见并保持其值不变;在
函数
的声明
中
,则可以用来限定
函数
的作用域,使得
函数
仅在当前文件
中
可见。另外,在
static
函数
中
,所有声明在
函数
体外的
变量
都
会
自动成为
static
变量
,这些
变量
会
保留其值,而不像普通
变量
一样在
函数
结束时被销毁。
使用
静态
函数
可以起到封装代码的作用,使得
函数
体只能在文件内被调用,从而避免了与其他文件
中
的
函数
产生命名冲突的可能。此外,
静态
函数
在编译时就已经被链接,相比较于
使用
动态链接的
函数
,可以提高程序运行效率,降低内存开销。最后,
静态
函数
也可以保护敏感代码,防止被其他文件
中
的
函数
所调用,提高程序的安全性。
总之,C语言
中
static
关键字的
应用
十分广泛,可以用于
变量
和
函数
的声明、作用域限定等方面,同时
使用
静态
函数
也可以提高程序的可读性、安全性和效率。