我似乎在这里误解了一些东西。我有一个DLL(比如DLL_1),它有一些C ++类导出供客户使用。
静态库使用这些导出的类(比如SLib_1)。
还有一个其他DLL(比如DLL_Client)仅依赖于前面提到的静态库,因此链接到SLib_1。所以我有:
DLL_Client ==> SLib_1 ==> DLL_1
构建SLib_1时,链接器是否从DLL_1解析导出的类?只有在构建DLL_Client时才会发生这部分吗?
根据上述答案,我还有另一个问题。考虑到我还有另一个静态库,比如SLib_2。如果我重写上面的依赖路径,如下所示:
DLL_Client ==> SLib_2 ==> SLib_1 ==> DLL_1(每个模块只知道并链接其后面的模块)
DLL_1导出的符号应该对DLL_Client可见吗?编译/链接整个设置时我没有问题。我的问题只在运行时发生。也就是说,当我使用Dependency Walker加载DLL_Client时,我发现它抱怨无法解析DLL_1中的导出函数。
是什么给出了?
答案 0 :(得分:1)
对于第一个问题,静态库只是对象文件的集合。构建静态库时没有解决任何问题(事实上,如果你只有头文件,那么你可以编译,你可以构建静态库,而不需要任何其他代码)。只有在将这些目标文件链接到DLL中时,才会解析静态库中的依赖关系。
对于你的第二个,简短的回答是否定的。当/如果静态库依赖于另一个库(静态或动态)时,静态库不会使库中的符号依赖于最终用户可见。这又回到了它只是一个目标文件集合的事实。将对象文件放在库中通常不会 1 更改有关符号可见性或类似内容的任何内容。
简而言之,如果DLL_Client需要SLib_2 中的函数并且直接使用DLL_1中的函数,则需要链接SLib_2.lib和DLL_1.lib。
1 为了避免有人提起它们,我会补充说,库通常包含一些具有某种特殊可见性的符号,例如弱外部。即使在这里,它也没有把它们放在使它们变得特别的库中 - 只是当你在库中放置某些内容时,这些特殊可见性选项几乎是唯一真正必要或有用的时候。