2

因为喜欢折磨自己,所以在将 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 二进制文件出现“错误地址”错误。

4

1 回答 1

1

再一次,在我提出问题 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 的编辑,使得构建完成并且二进制文件在设备上运行。

于 2013-10-27T20:09:54.290 回答