在64位Mac / OSX环境中编译和汇编Data element too large
(免费Pascal编译器)时,如何解决并修复致命fpc
错误?
似乎错误的原因可能是array[0..MaxInt]
调用(有关更多详细信息,请参见下文),但如果是这样,我不知道如何修复它或解决它。
详细信息:使用从{{3}安装的build.sh
3.0.0-rc1从https://github.com/whatwg/wattsi运行fpc
脚本时出现错误(来自pc-3.0.0rc1.intel-macosx.dmg
图片)。 (注意: ftp://freepascal.stack.nl/pub/fpc/beta/3.0.0-rc1/i386-macosx/ - 而不是,我猜,v2.6.4,最新稳定?)。
构建运行正常,直到编译README.md file says I need to use 3.0.0-rc1 specifially源后,它在尝试汇编该源时失败并显示Data element too large
错误。
具体来说,它记录了这个:htmlparser.pas(336,42) Error: Data element too large
。该htmlparser.pas
文件的第333到336行看起来像这样:
type
TBlob = Pointer;
PBlobArray = ^TBlobArray;
TBlobArray = array[0..MaxInt] of TBlob;
...所以我怀疑Data element too large
错误是由于array[0..MaxInt]
会导致某种系统限制造成的?{/ 1}}
到目前为止,我的故障排除尝试的范围是在构建来源的https://github.com/whatwg/wattsi/blob/master/src/html/htmlparser.pas文件中,有一行ulimit -v 800000
,我认为这可能会过度限制内存资源 - 所以我删除了那一行并重新运行了构建脚本,但我仍然在同一点上遇到Data element too large
错误。
我在Free Pascal总计n00b,所以在这一点上我完全被这个错误所困扰。
答案 0 :(得分:1)
最近的FPC做了一种编译时间范围检查。这个范围检查确定类型太大的编译时间,即使它实际上从未被分配过(总是使用指针使用,旧的Delphi版本不能过度索引指针,所以使用了这个结构)
这是该技术的已知限制,严格来说原始来源是错误的。
由于类型可能永远不会分配,只需重新调整bounderies以适应,例如
TBlobArray = array[0..MaxInt div sizeof(tblob)] of TBlob;
(可能减去一些元素以确定,我不知道2GB-2是否是真正的限制,IIRC旧的delphis有下限)
甚至只是
TBlobArray = array[0..0] of TBlob;
在您访问它的位置禁用运行时检查。高上限是一个不会进入运行时检查的人工构造
答案 1 :(得分:0)
尝试从{/ 3>更改src/build.sh中的DEFINES
行
DEFINES="-dUSEROPES -dLINES -dPARSEERROR"
到
DEFINES="-dUSEROPES -dLINES -dPARSEERROR -Px86_64"
这实际上是一个新的注释添加到repo原点README.md