"Error 309" 是什么意思?
What does "Error 309" mean?
在我们的构建中,我们正在创建一个带有单元测试的可执行文件,如下所示:
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
scons: *** [build\debug\libname\test_libname.dummy] Error 309
此错误消息不是很有帮助。这是什么意思以及如何解决?
当写成 0xC0000135
时,幻数 309
更 googleable(不知道为什么 C
,但是135
HEX == 309
DEC),它是 STATUS_DLL_NOT_FOUND
错误的标识符。
所以,这不是 SCons 错误,而是 Windows 错误,通过 SCons 泄漏。
这意味着缺少一些 VLD 需要的 DLL。潜伏在VLD安装目录(一般为:C:\Program Files (x86)\Visual Leak Detector)的bin\Win32子目录下可以找到2个DLL文件和1个manifest文件。
为了不让构建依赖于机器的环境,您可以将目录添加到 env['ENV']['PATH']
或将文件复制到进行测试的目录 运行。
做后者:
除了库目录,您还需要另一个 VLD 配置选项,即二进制文件目录。我们称它为 vldBinDir
。在构建启动时,您可以将这些文件复制到构建目录:
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)
在我们的构建中,我们正在创建一个带有单元测试的可执行文件,如下所示:
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
scons: *** [build\debug\libname\test_libname.dummy] Error 309
此错误消息不是很有帮助。这是什么意思以及如何解决?
当写成 0xC0000135
时,幻数 309
更 googleable(不知道为什么 C
,但是135
HEX == 309
DEC),它是 STATUS_DLL_NOT_FOUND
错误的标识符。
所以,这不是 SCons 错误,而是 Windows 错误,通过 SCons 泄漏。
这意味着缺少一些 VLD 需要的 DLL。潜伏在VLD安装目录(一般为:C:\Program Files (x86)\Visual Leak Detector)的bin\Win32子目录下可以找到2个DLL文件和1个manifest文件。
为了不让构建依赖于机器的环境,您可以将目录添加到 env['ENV']['PATH']
或将文件复制到进行测试的目录 运行。
做后者:
除了库目录,您还需要另一个 VLD 配置选项,即二进制文件目录。我们称它为 vldBinDir
。在构建启动时,您可以将这些文件复制到构建目录:
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)