2011-01-10 73 views
7

e.exe与我的自定义静态库c.lib链接,该库使用在w.dll中定义的Win32 API。 w.dll位于C:\ Windows \ System32,其导入库为w.lib,位于Windows SDK目录中。壳牌w.lib被列为附加依赖​​c.libe.exe项目? (e.exe在这两种情况下都能成功建立。)最佳做法是什么?为什么?我猜e.exe不应该知道关于w.lib具有相关性的静态库

c.lib旨在仅由一组开发人员共享(不会发送给客户)。

TEST:我用VS2008和DUMPBIN实用程序来测试这两种情况下,这里是结果:

  • 案例1:w.lib添加附加依赖​​c.lib项目。

dumpbin /archivemembers c.lib输出列出了从c.lib项目作为归档成员w.dll都偏移和.obj文件。

  • 案例2:w.libc.libe.exe项目添加其他相关

这一次,DUMPBIN输出仅包含c.lib .obj文件和c.lib尺寸小于在情况1中

c.lib被添加为附加依赖​​性w.exe项目在这两种情况下)

注意:我用w.libw.dll这里虚构,通用名称为Windows库,但他们可能是如Userenv.lib和Userenv.dll或Version.lib和Version.dll ...

回答

1

我认为你误解了创建档案和导入档案所做的事情。

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

创建从w.libc.lib的过程简单地提取w.lib的对象,并将它们附加到物体在c.lib集合。实际上,c.lib成为导入库+代码。

我认为你应该这样做吗?不是真的 - 它可能导致混淆e.exe依赖于;我认为你应该明确地做到这一点,而不是试图隐藏它。这就是说,这只是一个建议,而不是一个规则。

+0

谢谢您的全面解答。我最初的推定是错误的 - 我认为这是可取的exe不知道lib的依赖关系,但现在当我从* import library + code *的角度来看待它时,让exe知道它的代码是什么包括来自静态库的代码)依赖于。 – 2011-01-10 14:33:07

0

库没有链接,所以任何使用.lib的项目也都需要它的依赖关系。

基本上,.lib在链接过程中被“复制”到您的exe文件中。

如果你想避免你的用户明确地链接againts w.lib,在dll中转换c.lib,dll是链接的,并且在构建期间你不需要它们的依赖关系。

+0

据我所知,`link.exe`不能解析外部引用,而只是为了创建静态库而压缩一组`obj`文件。我的问题是关于编译时的依赖关系 - 情况1显示`e.exe`完全不知道`w.lib`。当然,`w.dll`必须在运行时出现。 – 2011-01-10 13:49:51