在c++中,标准库是在模板中实现的,这意味着它们将在每个共享库中实例化,必须存在两个库具有相同名称的相同函数,例如
std::vector<std::string>
,不同的库可能都实例化那么当这些库在同一个进程中使用时,链接器如何解析符号,这是否意味着一个库中只使用了一个代码?
例如,如果链接器使用lib a中的实现,当程序结束并且lib a未映射时,是否会导致其他使用实现的lib失败?
从显而易见的开始:库以一个顺序加载,以相反的顺序卸载,这样非循环依赖就可以工作。
现在再问一个问题:动态链接器如何解析符号以使其不被过早卸载?答案很简单:只使用第一次出现的情况。它将被最后卸载。
请注意,大多数
std::vector<std::string>
方法可能是内联的,并且不会出现在任何库中,正是因为它们是模板。 operator[]
例如,它只不过是简单的加法而已。