【问题标题】:Cross-Native GCC 4.8 Build: libcpp Error: invalid conversion from long long to off_t (aka long int)Cross-Native GCC 4.8 Build: libcpp Error: invalid conversion from long long to off_t (aka long int)
【发布时间】:2013-11-05 04:45:49
【问题描述】:

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

【问题讨论】:

  • C 中的对象指针类型之间没有隐式转换(void * 除外)。
  • 编辑:等等...根据 Pocket C(我在发布此内容后捡到的),标量和指针类型之间可以进行隐式转换。对象指针和指针类型有区别吗?

标签: android c gcc type-conversion long-integer


【解决方案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 的编辑,使得构建完成并且二进制文件在设备上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多