我有一个批处理文件尝试使用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
工具的一些问题。
答案 0 :(得分:2)
问题在于TLib不希望在没有输入管道的情况下重定向(seen here)。通过使用set_stdin_behavior
答案 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来解决此问题,并关闭“捕获输出”选项。
我没有测试过,但我希望有所帮助。