【问题标题】:IN_ADDR struct strangely defined in android在 android 中奇怪地定义了 IN_ADDR 结构
【发布时间】:2011-02-18 11:10:05
【问题描述】:

我正在尝试在 android 上编译网络代码并看到编译错误。我使用的结构是 ip_mreq_source 应该像这样在标题中定义:

struct ip_mreq_source {
  struct in_addr imr_multiaddr;
  struct in_addr imr_sourceaddr;
  struct in_addr imr_interface;
};

其中 in_addr 应定义为:

typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

我的详细错误来自基于 Android 的编译器的 g++ (GCC 4.4.3):

    arm-linux-androideabi-g++ -MMD -MP -MF groupsock/GroupsockHelper.o.d.org -fpic
 -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ 
-D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float 
-fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-
limit=64 -Igroupsock/include -Igroupsock/../UsageEnvironment/include -Iandroid-
ndk-r5b/sources/cxx-stl/system/include -Igroupsock -DANDROID  -Wa,--noexecstack 
-DANDROID_NDK -Wall -fexceptions  -O2 -DNDEBUG -g   -Iandroid-8/arch-arm/usr/include -c  
groupsock/GroupsockHelper.cpp -o groupsock/GroupsockHelper.o && rm -f 
groupsock/GroupsockHelper.o.d && mv groupsock/GroupsockHelper.o.d.org 
groupsock/GroupsockHelper.o.d
groupsock/GroupsockHelper.cpp: In function 'Boolean socketJoinGroupSSM(UsageEnvironment&, int, netAddressBits, netAddressBits)':
groupsock/GroupsockHelper.cpp:427: error: request for member 's_addr' in 'imr.ip_mreq_source::imr_multiaddr', which is of non-class type '__u32'
groupsock/GroupsockHelper.cpp:428: error: request for member 's_addr' in 'imr.ip_mreq_source::imr_sourceaddr', which is of non-class type '__u32'
groupsock/GroupsockHelper.cpp:429: error: request for member 's_addr' in 'imr.ip_mreq_source::imr_interface', which is of non-class type '__u32'

我不确定是什么导致了错误。任何指针都会很棒 - 没有双关语。 谢谢

【问题讨论】:

  • 给我们x结构,还有具体的错误信息,请(:另外,这看起来更像C,而不是C++
  • “struct x”是如何声明的?推测成员 s 不是 __u32,但 Value 是。
  • 如果您的机器上有 /usr/include/netinet/in.h,则 struct1 -> ip_mreq, x -> in_addr(对多播地址、互联网地址等采取不同的形式)。我还没有找到“x”的正确声明。还在寻找:(
  • 明白了! struct x { uint32_t s; }
  • 值也是 u_int32_t 类型 :(....不知道这是怎么回事。虽然我必须说成员 's' 实际上是 'in_addr_t' 类型,其中:typedef uint32_t in_addr_t

标签: c++ android c struct android-ndk


【解决方案1】:

感谢大家的帮助。 能够在我使用的 android g++ 编译器的包含文件版本中追踪到不同结构定义的错误。

原来 Android 平台 g++ 包含文件非常有限。这些头文件中结构的定义是这样的:

struct in_addr
  {
    __u32 s_addr;
  };

还有:

struct ip_mreq_source {
  __u32 imr_multiaddr;
  __u32 in_addr imr_sourceaddr;
  int some_other_var
};

所以我的 struct2、struct3 和 struct4 实际上是 __u32(asm/types.h 中定义的无符号整数),在这个旧版本中甚至不是结构。 为了解决这个问题,我将我的用法改为:

struct struct1 st1;
st1.struct2 = Value

代替:

struct struct1 st1;
st1.struct2.s = Value;

感谢你引导我正确的方式。

;

【讨论】:

    【解决方案2】:

    以下工作没有问题,你的问题是什么?

    #include <stdint.h>
    
    typedef uint32_t in_addr_t;
    
    struct x {
      in_addr_t s;
    };
    
    struct foo {
      x a;
      x b;
      x c;
    };
    
    int main() {
      uint32_t v = 5;
      foo f;
    
      f.a.s = v;
    
      return 0;
    }
    

    【讨论】:

    • 我正在尝试在 Android 平台上构建一个用 C++(和一些 C)编写的网络服务器项目。 g++ 编译器基于 gcc4.4.4,但我不确定它是否被大量剥离。您的代码在标准 g++ 上编译,但使用 Android 编译器时出现错误:error: stdint.h: No such file or directory; error: 'uint32_t' does not name a type; error:'in_addr_t' does not name a type; In function 'int main()': 'uint32_t' was not declared in this scope; error:'struct x' has no member named 's'; 'v' was not declared in this scope
    • 用更多细节编辑了我之前的问题。谢谢
    【解决方案3】:

    您提供的代码示例没有任何问题。唯一能想到的合理解释是,有一个 #define 与“x”的名称冲突,并将其替换为“__u32”(无符号整数?)。

    您应该尝试预处理有问题的源文件(g++ 的 -E 标志)以执行宏扩展并检查输出中“struct1”的定义。

    【讨论】:

    • 在下面回复。很抱歉没有发表评论。另请参阅我在先前回复中关于我正在使用的编译器的评论。谢谢
    • 用更多细节编辑了我之前的问题。此外,使用 -E 进行预处理会返回 struct1 的结构,如我编辑的问题中的 struct ip_mreq_source 所示。谢谢
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2012-09-07
    相关资源
    最近更新 更多