DOS报告错误:文件号错误

时间:2010-07-02 19:43:09

标签: c++ cygwin c++builder

我有一个批处理文件尝试使用Borland C ++ Builder 6.0编译静态库

从Borland make(使用bpr2mak创建的makefile)调用它从.bat文件调用(用于使用Visual Studio和一些Borland C ++ Builder遗留项目编译整个项目),这是从bash shell脚本调用的在Cygwin里面跑。

当我直接从Cygwin shell运行.bat文件时,它运行正常,但当它从一个使用Boost :: Process :: launcher调用cygwin的程序运行时,我收到此错误:

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

这是一个复杂的场景,但只要我们需要构建我们需要为各种Linux distos和Windows 32和64位构建的软件包,这个调用cygwin的程序就会运行。

注意:这是唯一的Borland项目失败,其他编译得很好(它也是使用borland的唯一静态库,所以它可能是TLib工具的一些问题。

4 个答案:

答案 0 :(得分:2)

问题在于TLib不希望在没有输入管道的情况下重定向(seen here)。通过使用set_stdin_behavior

在Boost :: Process :: launcher中创建输入管道来解决此问题

答案 1 :(得分:1)

我只是在这里猜测,但这可能与路径中的长文件名和/或空格有关。

1)修改您的makefile,以便在执行失败命令(set > d:\env.txt & echo CD=%CD% >> d:\env.txt)之前立即将当前环境保存到文件中。然后双向运行(直接和通过程序)并比较良好运行和不良运行的环境。

2)使用来自Sysinternals的filemon,在两种情况下捕获磁盘访问的日志(这些日志将是巨大的,但您可以取消选中除过滤器中的Open之外的所有内容以减小大小)。再次,比较并检查线索......

3)尝试将所有涉及的内容安装到符合8.3方案的路径上。

答案 2 :(得分:0)

此错误与C ++本身无关。当您的构建脚本打开太多文件(超过DOS命令处理器环境中定义)时,就会发生这种情况。要解决此问题,请尝试将files变量的值设置为253.对于Windows XP,此变量在文件%WINDIR%\system32\config.nt中定义。

files=253

答案 3 :(得分:0)

似乎它是已知的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
  

解决方法:在某些情况下(如果看到“错误的文件编号”错误),可以通过在BPR2MAKE选项字段中指定-tDEFLIB.BMK来解决此问题,并关闭“捕获输出”选项。

我没有测试过,但我希望有所帮助。