因为我喜欢折磨自己,所以在将GCC 4.7移植到Android之后,我决定立即尝试将GCC 4.8移植到Android。
我在构建的libcpp部分遇到以下错误:
../../gcc-4.8/libcpp/files.c:725:27: error: cannot convert 'long long int*' to 'off_t* {aka long int*}' for argument '7' to 'unsigned char* _cpp_convert_input(cpp_reader*, const char*, unsigned char*, size_t, size_t, const unsigned char**, off_t*)'
我的问题是:这种转换是否可能?
编辑:我最初发布的答案是,需要编写一个强制转换,而不是依赖隐式转换,但是鉴于这样做之后我遇到的问题,我将其删除。
这是原始的有问题的代码:
file->buffer = _cpp_convert_input (pfile,
CPP_OPTION (pfile, input_charset),
buf, size + 16, total,
&file->buffer_start,
&file->st.st_size);
这是我尝试过的演员表(注意:我对C仅有基本的了解):
off_t ot = (off_t) file->st.st_size
在目标设备上运行时,使用上述强制转换会导致cc1二进制文件出现“地址错误”错误。
在我问问题24小时后,答案再次出现。
注意:以下是从24个小时开始的C语言解析,如果其中任何一个不正确,请随时发表评论。
“缩小”转换与“隐式”转换相同,这显然在Android本机开发中是不允许的,或者在Bionic libc中是不可能的...我不确定。因此,为了使files.c中的函数正常工作,需要将传递给_cpp_convert_input的long long int强制转换为off_t。
我将强制转换添加到files.c中作为解决方法;如果构建成功,我将使用它更新此答案。
编辑:不幸的是,我添加的强制转换无法正常工作...构建已完成,但是在设备上运行时,生成的二进制文件却抛出了“错误的地址”。我将修改发布到另一个问题。
编辑:强制转换工作...我只是写不正确。感谢乔纳森·韦克利(Jonathan Wakely)纠正了这个错误:
off_t ot = (off_t) file->st.st_size
funct(*args*, &ot)
到这个:
off_t ot = (off_t) file->st.st_size;
funct(*args*, &ot);
file->st.st_size = ot;
加上在macro.c中添加的另一个显式强制转换以及对gengtype.c,gcc / Makefile.in和double-int.h的编辑,使构建完成并且二进制文件可以在设备上运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句