我正在读一本关于gcc的书,以下段落让我困惑:
此外,共享库可以使用以下方式更新库: 重新编译使用它的程序(提供接口到 库不会改变。)
这只是指尚未联系的节目,对吧? 我的意思是,在C中是不是可执行代码完全独立于编译器?在哪种情况下,对库的任何更改,无论其接口或实现是否与可执行代码无关?
答案 0 :(得分:2)
共享库在执行程序之前不会链接,因此可以升级/更改库而无需重新编译(也不需要重新链接)。
EG,在Linux上,可能有
/bin/myprogram
取决于
/usr/lib64/mylibrary.so
使用其他版本替换mylibrary.so
(只要它导出的函数/符号相同/兼容)将在下次启动myprogram
时影响myprogram
。在Linux上,这由系统程序/lib64/ld-linux-x864-64.so.2
或类似程序处理,系统在程序启动时自动运行。
与静态库形成对比,该库在编译时链接。对静态库的更改需要重新链接应用程序。
作为一个额外的好处,如果两个程序共享相同的共享库,内存占用可以更小,因为内核可以“告诉”它是相同的代码,而不是将它复制到RAM两次。对于静态库,情况并非如此。
答案 1 :(得分:1)
不,这是关于 链接的代码。如果链接到静态库并更改库,则可执行文件将不会获取更改,因为它包含自己的库原始版本副本。
如果链接到共享库(也称为动态链接),则可执行文件不包含库的副本。程序运行时,会将当前版本的库加载到内存中。这允许您修复库,修复程序将被库的所有用户选中,而无需重新链接。
答案 2 :(得分:0)
库为外界提供接口(API)。使用库的应用程序(例如.DLL)绑定到接口(意味着它们从API调用函数)。只要不修改接口,库作者就可以自由修改库并重新分发新版本。
如果库作者要修改界面,他们可能会破坏所有依赖于该功能的应用程序!