2012-04-24 99 views
0

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

为力霸源文件看起来是这样的:

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 

但如果可能的话,我想一些方法来实现这一目标,作为力霸构建过程的一部分同样的效果,因为在构建过程中稍后一些目标依靠力霸。

谢谢!

回答

0

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

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

这不是问题的答案。 – bmargulies 2012-09-14 20:57:31

+0

非常迟的回复,但实际上,@ bmargulies,这是对这个问题的回答。 +1。我在构建过程中寻找一种方法将其他库静态链接到目标库(LibA)。这正是这样做的。但是,如果要链接到LibA的库也是作为构建过程的一部分构建的,则存在竞争条件,因为无法通过某种类型的包装脚本强制构建订单而无法保证它们已经创建。 'build.exe'并行运行构建。 – user1354557 2013-02-19 16:31:03

0

lib实用程序可以组合库。用你的例子,命令是:

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

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

1

我意识到这是一个迟到的答案,它甚至可能不是你想要的结果。然而,ddkbuild.cmd有一个非常漂亮的机制来运行特定目录内部构建之前和之后的操作。

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

注:据我所知,你不能直接用build.exe实现你想要的。然而,使用某些制作(NMake)文件杂技很可能会获得类似的结果。所以问题在于是否值得重新发明轮胎。

+0

我想完全通过nmake来达到这种效果,因为那时我只需键入'build'并立即创建所有子项目。我尝试使用'NTTARGETFILE2'处理构建后操作,但由于构建顺序无关紧要,我的成功取决于竞争条件。我最终做的是编写一个通用的包装器脚本,它以某种给定的顺序逐个构建每个子项目 - 这允许我在'makefile.inc'中使用'NTTARGETFILE2'和链接器命令以及其他后期构建操作,没有任何问题。无论如何,+1为'ddkbuild.cmd';这非常有用。 – user1354557 2013-02-19 16:30:11