2015-01-06 10 views
3

В нашей сборке мы создаем исполняемый файл с юнит-тестов, как это:Что означает «Ошибка 309»?

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) 

Up к этому моменту все работает нормально: тесты выполняются во время сборки.

Я недавно нашел инструмент 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: *** [построить \ Debug \ Имя_библиотеки \ test_libname.dummy] Сообщение об ошибке 309

Эта ошибка не очень полезно. Что это значит и как это исправить?

ответ

6

Оказывается, что магическое число 309 является более googleable когда написано как: 0xC0000135 (не знаю, почему C, но 135 HEX == 309 декабря), и это идентификатор ошибки STATUS_DLL_NOT_FOUND.

Таким образом, это не ошибка SCons, а ошибка Windows, которая протекает через SCons.

Это значит, что некоторые DLL отсутствуют в VLD. Скрываясь в каталоге установки VLD (обычно: C: \ Program Files (x86) \ Visual Leak Detector), два файла DLL и один файл манифеста можно найти в подкаталоге bin \ Win32.

Чтобы не быть зависимым от сборки в среде машины, вы можете либо добавить каталог в 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) 
+1

Или просто включите правильный путь в задаваемый env ['ENV'] ['PATH'] ... – bdbaddog

+0

@bdbaddog Хорошая точка, обновленная, – BartoszKP

Смежные вопросы