具有依赖项的静态库

Boj*_*zec 7 c++ winapi static-libraries visual-studio

e.exe链接到我的自定义静态库c.lib,它使用在中定义的Win32 API w.dll.w.dll位于C:\ Windows\System32,其导入库w.lib位于Windows SDK目录中.壳牌w.lib被列为附加依赖c.libe.exe项目?(e.exe在两种情况下都能成功构建.)最佳实践是什么?为什么?我想e.exe不应该知道w.lib.

c.lib 仅供一组开发人员共享(不得发送给客户).

测试:我使用VS2008和dumpbin实用程序来测试这两种情况,结果如下:

  • 案例1:在项目中w.lib添加为附加依赖项c.lib.

dumpbin /archivemembers c.lib输出列出项目中的偏移w.dll和.obj文件c.lib作为存档成员.

  • 案例2:w.lib不添加额外的依赖c.lib,但在e.exe项目:

这次,dumpbin输出只包含.obj文件,c.lib其大小c.lib小于Case 1

(c.lib添加为其他依赖w.exe在这两种情况下的项目.)

:我使用w.lib,并w.dll在这里为Windows库虚构的,通用的名字,但他们可能是如Userenv.lib和Userenv.dll或Version.lib和VERSION.DLL ...

小智 1

我认为您误解了创建存档和导入存档的作用。

正如您在评论中正确猜测的那样,创建存档会创建一个包含编译后的 .obj 的统一文件。现在,它可以包含您喜欢的任何代码,包括但不限于对库的动态调用。导入库是包含专门进行此类调用的 obj 的库,其想法是通过导入它,您的 exe 可以找到适当的符号(它们必须位于您创建的可执行文件中)。

c.lib创建from的过程w.lib只是提取w.lib的对象并将它们附加到 中的对象集合中c.lib。实际上,c.lib变成了导入库+代码。

我认为你应该这样做吗?事实并非如此——这可能会导致人们对e.exe依赖什么感到困惑;我认为你应该明确地使其可见,而不是试图隐藏它。也就是说,这只是建议,而不是规则。