【发布时间】:2014-04-01 13:50:07
【问题描述】:
如果用 C++ 编写的共享库更新(仅添加一些新的类成员函数),我应该重新编译整个程序吗?
我添加一些公共或私有数据成员如何?
谢谢
【问题讨论】:
标签: c++ shared-libraries
如果用 C++ 编写的共享库更新(仅添加一些新的类成员函数),我应该重新编译整个程序吗?
我添加一些公共或私有数据成员如何?
谢谢
【问题讨论】:
标签: c++ shared-libraries
只要它是一个共享库,与您的主程序动态链接,不,除非您更新了主应用程序和库之间共享的标头。
对象大小可能已经更新,如果您在主程序上使用静态分配,这可能会产生奇怪的问题(新的对象大小会溢出):
int main(int argc, char * argv[])
{
MyClass list[12];
return 0;
}
在动态库上更改 MyClass 的对象大小(通常通过添加成员)将是一个严重的问题!
【讨论】:
您应该进一步阅读两个关键字:源代码兼容性,这意味着您的程序在更新库后仍然可以编译,以及二进制兼容性,这意味着你编译的程序在更新库后仍然可以正常运行。
大多数主要库(例如 glibc 或 libpng)在较长的版本范围内保持二进制兼容(通常主要版本的所有版本都是二进制兼容的),并且几乎从不破坏源代码兼容性。
有测试二进制和源代码兼容性的自动化工具(例如this one)。
【讨论】:
这个问题有两个答案:否和是。
如果库只有小更新,或者新功能是以向后兼容的方式添加的,那么您不需要做任何事情。当然,除非你想使用新功能,否则你必须修改代码并重新编译。
另一方面,如果库进行了一些不向后兼容的更改,那么您可能至少必须重新链接您的项目。但是,如果您安装这种向后不兼容的库,操作系统可能会保留旧版本,因此您的应用程序可能会使用旧版本,而您无需执行任何操作。
【讨论】: