有一个动态库,其外露结构正在改变,新结构将添加到结构的末尾。
结构的内存是从库中分配的,应用程序不会分配它。但是,应用程序可能直接访问结构的成员。
在这种情况下,是否需要使用库重新编译应用程序?
正在所有操作系统(Windows,Linux,Solaris,HP-UX等)上使用库。
答案 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++
我会说,如果结构是公共的,它应该需要重新编译。如果结构仅供内部使用,则无关紧要。