IN_ADDR структура странным образом определяется в Android - PullRequest
3 голосов
/ 18 февраля 2011

Я пытаюсь скомпилировать сетевой код на 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;
  };

Моя подробная ошибка из g ++ (GCC 4.4.3) от компилятора на базе Android:

    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'

Я не уверен, что является причиной ошибки. Любые указатели были бы хороши - каламбур не предназначен. Спасибо

Ответы [ 3 ]

5 голосов
/ 20 февраля 2011

Спасибо всем за помощь. Был в состоянии отследить ошибку к различным определениям структуры в версиях включаемых файлов для компилятора 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;

Спасибо за то, что привели меня на правильный путь.

;

1 голос
/ 18 февраля 2011

Следующее работает без проблем, в чем ваша проблема?

#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;
}
0 голосов
/ 18 февраля 2011

Нет ничего плохого в приведенном вами примере кода. Единственное разумное объяснение, которое приходит на ум, это то, что где-то есть #define, который конфликтует с именем «x» и заменяет его на «__u32» (unsigned int?).

Вы должны попытаться предварительно обработать исходный файл-нарушитель (флаг -E для g ++), чтобы выполнить расширение макроса и проверить определение 'struct1' в выходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...