静态库遇到静态库

栏目: C++ · 发布时间: 6年前

内容简介:作者:在C或C++的世界里,一切皆符号。在C或C++的世界里,一切皆符号。稍有不慎就会遇到找不到符号的问题。

作者: tiankonguse | 更新日期:

在C或C++的世界里,一切皆符号。

一、背景

在C或C++的世界里,一切皆符号。稍有不慎就会遇到找不到符号的问题。

最近更新静态库,遇到里两个符号问题,这里来看看静态库遇到静态库时都会遇到什么问题吧。

二、单向依赖问题

最常见的符号问题就是一个静态库依赖另一个静态库问题了。

例如有下面代码:

add库实现加法,mul库实现乘法,但是依赖add库。

A程序 server只依赖add库。

B程序 client依赖mul库。

静态库遇到静态库

这里先问第一个问题:如下图,对于mul库,依赖的add库的头文件放在源码c文件里client程序可以编译通过运行吗?

静态库遇到静态库

答案是肯定的。

因为依赖库的头文件只用于编译检查,如果mul库的头文件不依赖add库的符号,放在mul的源码文件是没问题的。

接着问第二个问题:上上那张图中,add库和mul库的位置正确吗?client程序是否可以编译?编译出来后是否可以运行?

对于这个问题,是所有人最常遇到的问题。

**链接程序的实现方式决定了,被依赖的库应该放在后面。**

所以图中两个静态库的位置不正确,程序编译不通过。

三、静态库与改名

不知大家有没有注意到,对于add库里面,函数名是add1。

那个是我故意加的,含义为初期这个库拼写不规范,名字有问题。

此时我们想把add1修改成add该怎么办呢?

假设没有Mul库,也就是大家都是直接使用add库的,我们在升级add库时进行改名即可。

有些旧程序为了能够兼容,我们可以将add名称映射到add1。

**对于函数,一般使用define重定义,而对于类型,则使用typedef重定义。**

静态库遇到静态库

但是可以发现,如果有静态库对add库进行了进一步封装,则那些依赖add库的静态库就会有问题。

**这是因为define是在预处理阶段进行的,typedef是在编译阶段进行的,而静态库已经经历过编译了,所以他们依赖的符号都是确定的,不能变更了。**

因为我们不知道是否有人对这些库进一步封装。

面对这个问题,我们就不能改名了,历史是什么名字就保留什么名字了。

四、静态库追与默认参数

如果对于c++程序,经常会有一堆默认参数,随着业务的发展还经常会加默认参数。

静态库遇到静态库

这时候,如果有业务依赖这个公共库,增加了默认参数后,client程序还能正常编译或运行吗?

想要弄清楚加了默认参数后能不能正常编译或运行,就需要知道默认构造参数是怎么实现的。

对于c++语言,可以有相同的函数名,参数类型不同即可。

所以c++函数的符号是函数名和参数类型一起组成的,每一个函数只会生成一个符号。

而对于默认参数,c++是在编译的时候自身生成各个默认参数的临时变量,最终还是以完整的参数调用函数的。

五、结尾

了解了上面的机制,我们可以得出一个结论:曾经提供出去的静态库的接口再也不能变更了。

不管是函数名,或是默认参数的个数,都不能有丝毫的变更。

那想要增加默认参数怎么办呢?

对于改名这个场景,只能新的名指向旧的名称。

对于新增默认参数,只能新增函数了。

其实,google c++ style里面有一条说明:禁止使用默认参数。

而看看我们这个业务,默认参数竟然多大五六个,看来以后都需要改成重载的方式了。

另外,静态库与静态库还有很多其他的东西。

比如循环依赖,比如希望将一个静态库打包进另一个静态库,这个就不多说了。

本文首发于公众号:天空的代码世界,微信号:tiankonguse-code。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ggplot2:数据分析与图形艺术

ggplot2:数据分析与图形艺术

哈德利·威克姆 (Hadley Wickham) / 统计之都 / 西安交通大学出版社 / 2013-5-1 / CNY 46.00

中译本序 每当我们看到一个新的软件,第一反应会是:为什么又要发明一个新软件?ggplot2是R世界里相对还比较年轻的一个包,在它之前,官方R已经有自己的基础图形系统(graphics包)和网格图形系统(grid包),并且Deepayan Sarkar也开发了lattice包,看起来R的世界对图形的支持已经足够强大了。那么我们不禁要问,为什么还要发明一套新的系统? 设计理念 打个比......一起来看看 《ggplot2:数据分析与图形艺术》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具