如果库中的公开结构发生更改,是否必须重新编译使用它的应用程序?

时间:2011-06-13 10:00:33

标签: c compiler-construction linker structure

有一个动态库,其外露结构正在改变,新结构将添加到结构的末尾。

结构的内存是从库中分配的,应用程序不会分配它。但是,应用程序可能直接访问结构的成员。

在这种情况下,是否需要使用库重新编译应用程序?

正在所有操作系统(Windows,Linux,Solaris,HP-UX等)上使用库。

4 个答案:

答案 0 :(得分:3)

像FFmpeg这样的一些库就是这样的。 FFmpeg有一个struct AVFrame,其sizeof一定不能被应用程序使用,因为新字段可能只添加了一个次要版本。该库提供了分配struct AVFrame的功能;这些函数不允许分配它们的数组。必须注意避免使用比应用程序链接的旧版本;并非所有共享库机制都支持次要版本。

我认为这有点难看,但如果应用程序没有做不允许的事情那就应该没问题。更简洁的方法是保持需要扩展的结构布局。

答案 1 :(得分:2)

由于你的问题中存在这种情况:

  

结构的内存是从库中分配的,应用程序不会分配它。

您无需重新编译应用程序。说你需要的人完全错了。

答案 2 :(得分:1)

如果结构的大小没有改变,则不需要重新编译代码。这就是为什么你经常在公共API中看到这样的结构:

struct something {
  int public_field1;
  float public_field2;
  char padding[256];
}

添加新字段时,会在public_field2之后添加新字段,并且填充的大小会减小,以使总大小保持不变。

答案 3 :(得分:-1)

KDE技术库有一篇关于二进制兼容性的文章。

http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++

我会说,如果结构是公共的,它应该需要重新编译。如果结构仅供内部使用,则无关紧要。