5

我想快速修复项目的 .so 库之一。重新编译 .so 并替换原始文件是否安全?或者我必须重建并重新安装整个项目?还是视情况而定?

4

5 回答 5

4

这取决于。共享库需要与您的可执行文件二进制兼容。

例如,

  1. 如果您更改了库的内部函数之一的行为,您可能不需要重新编译。
  2. 如果您更改了应用程序已知的结构的大小(例如通过添加成员),您将需要重新编译,否则库和应用程序会认为结构比它小,并在库尝试时崩溃读取应用程序未写入的额外未初始化成员。
  3. 如果更改应用程序可见的任何函数的类型或参数位置,则确实需要重新编译,因为库将尝试从堆栈中读取比应用程序放入的参数更多的参数(C 就是这种情况,在 C++ 中,参数类型是函数签名的一部分,因此应用程序将拒绝运行,而不是崩溃)。

经验法则(对于生产版本)是,如果您没有意识到自己在维护二进制兼容性,或者不确定什么是二进制兼容性,则应该重新编译。

于 2011-09-15T11:23:29.387 回答
1

这当然是使用动态库的目的:如果库中的某些内容需要更新,那么您只需更新库,并且使用它的程序不需要更改。如果您要更改的函数的签名没有改变,并且它完成了同样的事情,那么这通常会很好。

当然,在某些极端情况下,程序依赖于函数的某些未记录的副作用,然后更改该函数的实现可能会改变副作用并破坏程序;但是c'est la vie

于 2011-09-15T11:20:36.980 回答
1

如果您没有更改共享库的ABI,您只需重建和替换库即可。

于 2011-09-15T11:20:49.553 回答
1

如果您不更改库二进制接口,则可以仅重新编译和重新部署共享库。

好的参考资料:

于 2011-09-15T11:20:56.427 回答
1

这取决于是的。

但是,我假设您拥有与构建其他东西完全相同的源代码和编译器,现在如果您只在.cpp文件中更改某些内容,那就没问题了。

其他事情,例如在头文件中更改接口(在共享库和系统的其余部分之间)是不好的。

于 2011-09-15T11:22:21.337 回答