DOS-сообщение об ошибке: неверный номер файла - PullRequest
0 голосов
/ 02 июля 2010

У меня есть командный файл, который пытается скомпилировать статическую библиотеку с использованием Borland C ++ Builder 6.0

Он вызывается из Borland make (make-файл, созданный с помощью bpr2mak), который вызывается из файла .bat (используется для компиляции всего проекта с помощью Visual Studio и некоторых устаревших проектов Borland C ++ Builder), который вызывается из сценария оболочки bash. работает внутри Cygwin.

Когда я запускаю файл .bat непосредственно из оболочки Cygwin, он работает нормально, но когда он запускается из программы, вызывающей cygwin с Boost :: Process :: launcher, я получаю эту ошибку:

C:\ARQUIV~1\Borland\CBUILD~1\Bin\..\BIN\TLib /u bclibs.lib @MAKE0000.@@@<br> DOS-reported error: Bad file number<br> TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation<br> opening 'MAKE0000.@@@'<br> ** error 1 ** deleting bclibs.lib

Это сложный сценарий, но эта Программа, которая вызывает cygwin, запускается всякий раз, когда нам нужно собрать наш программный пакет, который должен быть собран для различных дистрибутивов Linux и Windows 32 и 64-битных.

Примечание: это единственный сбой Borland Project, другой компилятор просто отлично (это единственная статическая библиотека, использующая также borland, поэтому может возникнуть некоторая проблема с инструментом TLib.

Ответы [ 4 ]

2 голосов
/ 05 июля 2010

Проблема заключалась в том, что TLib не нравится перенаправлять свой вывод (видно здесь) без наличия входного канала.Решается путем создания входного канала в Boost :: Process :: launcher с использованием set_stdin_behavior

1 голос
/ 02 июля 2010

Я просто догадываюсь здесь, но это может быть связано с длинными именами файлов и / или пробелами в путях.

1) Измените ваш make-файл так, чтобы он сохранял текущее окружение в файл непосредственно перед выполнением сбойной команды (set > d:\env.txt & echo CD=%CD% >> d:\env.txt).Затем запустите его обоими способами (напрямую и через программу) и сравните среды хорошего и плохого запуска.

2) Используя filemon от Sysinternals, в обоих случаях регистрируйте журналы доступа к диску (эти журналы будутогромный, хотя вы можете снять все, кроме Open в фильтре, чтобы уменьшить размер).Опять же, сравните и проверьте на наличие подсказок ...

3) Попробуйте установить все, что связано с путями, соответствующими схеме 8.3.

0 голосов
/ 05 июля 2010

Кажется, это известная ошибка в инструментах Borland C ++.Вот описание и возможное решение этой проблемы:

Проблема : Некоторые статические проекты Lib не будут правильно связываться при компиляции.Вы можете увидеть что-то вроде этого:

J:\Borland\CBUILD~1\bin\..\BIN\TLib /u debug\jpegD.lib @MAKE0000.@@@
DOS-reported error: Bad file number
TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation
opening 'MAKE0000.@@@'

** error 1 ** deleting debug\jpegD.lib
MAKE failed, returned : 1

Обходной путь : В некоторых случаях (когда появляется ошибка «Неверный номер файла»), возможно,Обойти это можно, указав -tDEFLIB.BMK в поле BPR2MAKE Options и отключив опцию «Capture Make Output».

Я не проверял его, но надеюсь, что это поможет.

0 голосов
/ 03 июля 2010

Эта ошибка не связана с самим C ++. Это происходит, когда ваш скрипт сборки открывает слишком много файлов (больше, чем определено в среде командного процессора DOS). Чтобы решить эту проблему, попробуйте установить значение переменной files равным 253. Для Windows XP эта переменная определена в файле %WINDIR%\system32\config.nt.

files=253
...