使用 WinDDK 静态链接多个库

Posted

技术标签:

【中文标题】使用 WinDDK 静态链接多个库【英文标题】:Statically linking multiple libraries with WinDDK 【发布时间】:2012-04-24 20:01:22 【问题描述】:

我正在使用 DDK 构建一个项目。一些构建目标生成小型内部库——为简单起见,我们称它们为 LibA.lib、LibB.lib 和 LibC.lib。但是 LibA 的代码引用了 LibB 和 LibC 的代码。要在项目中使用 LibA,还需要包含 LibB.lib 和 LibC.lib 以解析所有依赖项。 我想要做的是将 LibB 和 LibC 链接到 LibA 中,这样用户只需要包含 LibA.lib。我怎样才能做到这一点?

LibA 的 SOURCES 文件如下所示:

TARGETNAME=LibA
TARGETTYPE=LIBRARY

TARGETPATH=..\lib\$(DDKBUILDENV)

INCLUDES = .; \
           ..\LibB; \
           ..\LibC; \
           $(CRT_INC_PATH) \
           $(SDK_INC_PATH)

SOURCES = LibA_main.cpp \
          LibA_file2.cpp \
          LibA_file3.cpp

我了解您可以手动将库与link.exe 链接;例如,

link.exe /lib LibA.lib LibB.lib LibC.lib

但如果可能的话,我希望通过某种方式来实现与 LibA 构建过程的一部分相同的效果,因为构建过程后期的一些目标依赖于 LibA。

谢谢!

【问题讨论】:

【参考方案1】:

我意识到这是一个迟到的答案,最终它甚至可能不是你想要的。但是,ddkbuild.cmd 有一个非常漂亮的机制,可以在特定目录中构建之前和之后运行操作。

我们在我们的一个驱动程序库中使用它,该驱动程序库必须构建为多个静态库,并作为最后一步链接到一个大型静态库,就像您想要的那样。如果您能够在项目中使用 ddkbuild.cmd 之类的东西,这将提供一个解决方案,并且它也是一个可以在自动构建中工作的解决方案。

注意:据我所知,您无法通过build.exe 直接实现您想要的。但是,很可能通过一些 make (NMake) 文件杂技,您可以获得类似的结果。所以问题是,如果已经有***,是否值得重新发明。

【讨论】:

我想完全通过nmake来实现这个效果,因为这样我就可以输入build并一次制作所有的子项目。我尝试使用NTTARGETFILE2 进行构建后操作,但由于构建顺序很重要,我的成功取决于竞争条件。我最终做的是编写一个通用的包装脚本,它以给定的顺序单独构建每个子项目——这允许我在makefile.inc 中使用NTTARGETFILE2 与链接器命令和其他构建后操作,没有任何问题。无论如何,为ddkbuild.cmd +1;挺好用的。【参考方案2】:

我遇到了和你一样的情况。谷歌了很多,仍然没有解决方案。幸运的是,我终于找到了解决它的方法。您可以试试,在您的 libA 源文件中添加以下语句。

LIBRARIAN_FLAGS = $(LIBRARIAN_FLAGS) libB.lib libC.lib

【讨论】:

这不是问题的答案。 回复很晚,但实际上,@bmargulies,这是对问题的回答。 +1。我正在寻找一种在构建过程中将其他库静态链接到目标库(LibA)的方法。这正是它的作用。但是,如果您要链接到 LibA 的库也作为构建过程的一部分构建,则存在竞争条件,因为如果不通过某种包装脚本强制执行构建顺序,您无法保证它们已经创建。 build.exe 并行运行构建。【参考方案3】:

lib 实用程序可以组合库。使用您的示例,命令将是:

lib /out:CombinedLib.lib LibA.lib LibB.lib LibC.lib

【讨论】:

感谢您的回复,但此解决方案在功能上与我提到的 link.exe 相同。我正在寻找的是直接集成到构建过程中的东西(例如,可能类似于 TARGETLIBS 的宏)。我仍然没有找到一种方法来做到这一点,所以它甚至可能是不可能的,但到目前为止,我需要运行一个构建 LibA 的批处理脚本,然后链接 LibA,然后单独构建依赖于假设 LibA 包含 LibB 和 LibC。太丑了。

以上是关于使用 WinDDK 静态链接多个库的主要内容,如果未能解决你的问题,请参考以下文章

动静态链接库

静态库,链接到共享库

8静态函数库设计

OpenCV静态库编译与链接

CMake:具有多个项目的静态库

如何静态链接到 libstdc++.喜欢升级的GCC的朋友快来看看