"错误309"是什么意思?

Bar*_*zKP 3 c++ python windows scons visual-leak-detector

在我们的构建中,我们使用如下单元测试创​​建可执行文件:

tests = env.Program(os.path.join(env['testDir'], name + '_test'),
                    src + createManifest(env),
                    LIBS = libs,
                    LIBPATH = buildLibPath(env),
                    LINKFLAGS = env['LINKFLAGS'],
                    CPPPATH = cppPath)
Run Code Online (Sandbox Code Playgroud)

这正确地创建了一个可执行文件,以后由以下构建器运行:

action = tests[0].abspath + '&& echo %DATE% %TIME% > ${TARGET}'
runTests = env.Command(source = tests,
                       target = 'test_'+name+'.tmp',
                       action = action)
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切正常:测试正在构建期间运行.

我最近发现了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
Run Code Online (Sandbox Code Playgroud)

scons:***[build\debug\libname\test_libname.dummy]错误309

此错误消息不是很有帮助.它是什么意思以及如何解决它?

Bar*_*zKP 6

事实证明,当写成:(不知道为什么,但HEX == DEC)时,幻数309更具有可谷歌性,并且它是错误的标识符.0xC0000135C135309STATUS_DLL_NOT_FOUND

因此,它不是SCons错误,而是Windows错误,通过SCons泄漏.

这意味着VLD需要一些DLL丢失.潜伏到VLD安装目录(通常是:C:\ Program Files(x86)\ Visual Leak Detector)可以在bin\Win32子目录中找到两个DLL文件和一个清单文件.

不要让构建依赖于计算机的环境,您可以将目录添加到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
Run Code Online (Sandbox Code Playgroud)

然后,在创建特定测试时,请确保添加依赖项:

for n in env['vldDeps']:
    env.Depends(tests, n)
Run Code Online (Sandbox Code Playgroud)