Linker 使用WinDDK静态链接多个库

Linker 使用WinDDK静态链接多个库,linker,makefile,nmake,wdk,Linker,Makefile,Nmake,Wdk,我正在使用DDK构建一个项目。有几个构建目标生成小型内部库——为了简单起见,我们将它们称为LibA.lib、LibB.lib和LibC.lib。但是LibA的代码引用了LibB和LibC的代码。要在项目中使用LibA,还需要包含LibB.lib和LibC.lib以解析所有依赖项。我想做的是将LibB和LibC链接到LibA中,这样用户只需要包含LibA.lib。我怎样才能做到这一点 LibA的源文件如下所示: TARGETNAME=LibA TARGETTYPE=LIBRARY TARGETP

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

LibA的源文件如下所示:

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
;e、 g

link.exe /lib LibA.lib LibB.lib LibC.lib
但是,如果可能的话,我希望有一些方法可以达到与LibA构建过程相同的效果,因为构建过程中后期的一些目标依赖于LibA


谢谢

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

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

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

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

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

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


注意:据我所知,使用
build.exe
无法直接实现您的目标。然而,通过一些make(NMake)文件特技,很有可能达到类似的效果。因此,问题是,如果已经有了轮子,是否值得重新发明轮子。

感谢您的回答,但此解决方案在功能上与我在link.exe中提到的解决方案相当。我想要的是直接集成到构建过程中的东西(例如,可能是类似于TARGETLIBS的宏)。我仍然没有找到一种方法来实现这一点,所以这甚至可能是不可能的,但到目前为止,我需要运行一个批处理脚本来构建LibA,然后链接LibA,然后根据LibA包含LibB和LibC的假设单独构建其他每一个项目。这很难看。这不是问题的答案。回答得很晚,但实际上,@bmargulies,这是问题的答案+1.我在构建过程中寻找一种方法,将其他库静态链接到目标库(LibA)。这正是它所做的。但是,如果要链接到LibA的库也是作为构建过程的一部分构建的,则存在竞争条件,因为如果不通过某种包装器脚本强制执行构建顺序,则无法保证它们已经被创建
build.exe
并行运行构建。我希望完全通过nmake实现这一效果,因为这样我就可以键入
build
并一次生成所有子项目。我试图让生成后操作使用
NTTARGETFILE2
,但由于生成顺序很重要,我的成功取决于竞争条件。我最后做的是编写一个通用的包装器脚本,以给定的顺序分别构建每个子项目——这使我能够在
makefile.inc
中使用
NTTARGETFILE2
链接器命令和其他构建后操作,而不会出现任何问题。无论如何,
ddkbuild.cmd的+1;它非常有用。