1

我似乎在这里误解了一些东西。我有一个 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 中的导出函数。

是什么赋予了?

4

1 回答 1

1

对于您的第一个问题,静态库只是目标文件的集合。构建静态库时没有解决任何问题(事实上,如果您只有头文件,那么您可以编译,您可以构建静态库,甚至不存在任何其他代码)。只有当您将这些目标文件链接到您的 DLL 中时,静态库中的依赖关系才会被解析。

对于您的第二个,简短的回答是否定的。当/如果一个静态库依赖于另一个库(静态或动态),静态库不做任何事情来使最终用户可以看到它所依赖的库中的符号。这又回到了这样一个事实,即它只是一个目标文件的集合。将目标文件放入库中通常不会1改变任何关于符号可见性或任何类似的东西。

简而言之,如果 DLL_Client 需要 SLib_2 中的函数,并且还直接使用 DLL_1 中的函数,则它需要链接 SLib_2.lib 和 DLL_1.lib。


1 Lest somebody bring them up, I'll add that libraries do often contain a few symbols that have somewhat...special visibility, such as weak externals. Even here, it's not putting them in the library that makes them special though -- it's just that when you put something in a library is nearly the only time those special visibility options are really necessary or useful.

于 2012-12-05T04:01:20.040 回答