在我们的构建中,我们正在使用以下单元测试创建一个可执行文件:
tests = env.Program(os.path.join(env['testDir'], name + '_test'),
src + createManifest(env),
LIBS = libs,
LIBPATH = buildLibPath(env),
LINKFLAGS = env['LINKFLAGS'],
CPPPATH = cppPath)
这将正确创建一个可执行文件,该可执行文件随后将由以下构建器运行:
action = tests[0].abspath + '&& echo %DATE% %TIME% > ${TARGET}'
runTests = env.Command(source = tests,
target = 'test_'+name+'.tmp',
action = action)
到现在为止,一切正常:在构建过程中正在运行测试。
我最近找到了Visual Leak Detector工具,并希望将其包含在构建中。因此,我已经更改了构建者的环境,如下所示:
vldInclude = os.path.join(os.path.normpath(env['vldIncDir']), 'vld.h')
env.Append(CPPFLAGS='/FI' + vldInclude)
env.Append(LIBPATH = env['vldLibDir'])
vldLib = os.path.join(env['vldLibDir'], 'vld.lib')
libs.append(vldLib) # used in the Program call for the LIBS parameter, see above
此错误消息不是很有帮助。这是什么意思,以及如何解决?
最佳答案
事实证明,将魔术数字309
编写为:0xC0000135
(不知道为什么是C
,但是135
HEX == 309
DEC),它是googlet_code错误的标识符。
因此,通过SCons泄漏的不是SCons错误,而是Windows错误。
这意味着VLD需要缺少某些DLL。潜入VLD安装目录(通常为C:\Program Files(x86)\Visual Leak Detector),可以在bin\Win32子目录中找到两个DLL文件和一个 list 文件。
不要让构建依赖于计算机的环境,您可以将目录添加到STATUS_DLL_NOT_FOUND
或将文件复制到运行测试的目录。
要执行后者:
您需要在库目录旁边的另一个VLD配置选项,即binaries目录。我们称它为env['ENV']['PATH']
。在构建启动时,您可以将以下文件复制到构建目录:
def setupVld(env):
sourcePath = env['vldBinDir']
targetPath = env['testDir']
toCopy = ['dbghelp.dll',
'vld_x86.dll',
'Microsoft.DTfW.DHL.manifest']
nodes = []
for c in toCopy:
n = env.Command(os.path.join(targetPath, c),
os.path.join(sourcePath, c),
SCons.Defaults.Copy("${TARGET}", "${SOURCE}"))
nodes.append(n)
env['vldDeps'] = nodes
然后,在创建特定测试时,请确保添加依赖项:
for n in env['vldDeps']:
env.Depends(tests, n)