【发布时间】:2014-03-25 18:02:27
【问题描述】:
我对动态库的了解有限,而且我通常会遇到与我不理解的库相关的问题。 我最近从谷歌搜索中了解到图书馆,尤其是从以下链接:
Difference between shared objects (.so), static libraries (.a), and DLL's (.so)?.
http://www.ibm.com/developerworks/library/l-dynamic-libraries/。那篇文章对理解动态库及其用法非常有用:
如果我理解得很好(如果我错了请纠正我),共享对象有两种可能的用法:
动态链接:共享对象在程序启动时由动态链接器自动加载。
动态加载:共享对象在运行时通过动态加载API(dlopen、dlerror、dlsym和dlclose)在程序控制下加载和使用。该选项对插件很有用。
如果我做对了,在动态链接的情况下,所有的符号都会在编译时得到验证。这允许编译器/链接器准确地知道程序有效使用了哪个共享对象,哪个没有使用。
现在,动态链接器总是在运行时被调用,即使共享对象没有被使用。可以通过将空程序与运行时无法搜索的位置的库链接来验证它,并且执行将失败。当有更新并且不再需要使用库时,可能会发生将程序与程序中实际未使用的库链接的情况。当隔离程序的一部分进行调试,并链接到主程序的所有库时,也会发生这种情况。
我的问题是:是否可以要求编译器/链接器不包含对程序中没有引用符号的共享对象的引用? 是否有任何问题阻止编译器这样做?
以下帖子与当前问题有一些相似之处,但没有一个可以接受答案,也没有满足我好奇心的答案:
【问题讨论】:
标签: c++ compilation fortran dynamic-linking shared-objects