Как разрешить конфликтующие объявления (CPU_SET_T) между ACE и Android?

Цель кросс-компиляции: Android 7
Хост-ОС: Linux
NDK: Crystax 10.3.2 (b912)
OpenDDS: 3.11

Компиляция OpenDDS завершается с ошибкой и сообщает о конфликтующих объявлениях макросов C++. В файле ACE config-android.h указано это...

# define ACE_HAS_CPU_SET_T

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

У кого какие мысли как это обойти? Вот сообщение об ошибке, которое я вырезал сразу после сборки x86_64 и где начинается сборка руки.

.... (snip)
make: Leaving directory '/home/dev/dds-test/OpenDDS-3.11/build/x86_64/dds/idl'
Searching /home/dev/dds-test/ACE_wrappers for files...
Found 25764 files and directories in 0 seconds.
Creating /home/dev/dds-test/ACE_wrappers/build/arm
Finished in /home/dev/dds-test/ACE_wrappers/build/arm
Total time: 1 seconds.
Searching /home/dev/dds-test/OpenDDS-3.11 for files...
Found 5220 files and directories in 0 seconds.
Creating /home/dev/dds-test/OpenDDS-3.11/build/arm
Finished in /home/dev/dds-test/OpenDDS-3.11/build/arm
Total time: 0 seconds.
MPC_ROOT was set to /home/dev/dds-test/ACE_wrappers/build/arm/MPC.
Using .../dds-test/ACE_wrappers/bin/MakeProjectCreator/config/MPC.cfg
CIAO_ROOT was used in the configuration file, but was not defined.
DANCE_ROOT was used in the configuration file, but was not defined.
Generating 'gnuace' output using TAO_ACE.mwc
Skipping SSL_FOR_TAO (ssl_for_tao.mpc); it requires ace_for_tao.
Skipping QoS (qos.mpc); it requires qos.
Skipping ACE_FOR_TAO (ace_for_tao.mpc); it requires ace_for_tao.
Skipping ACE_XML_Utils (XML.mpc); it requires xerces.
Skipping ACE_FoxReactor (ace_foxreactor.mpc); it requires fox.
Skipping ace_svcconf_gen (svcconfgen.mpc); it requires ace_svcconf_gen.
Skipping TAO_FoxResource (FoxResource.mpc); it requires fox.
Skipping Bzip2Compressor (Bzip2Compressor.mpc); it requires bzip2.
Skipping ZlibCompressor (ZlibCompressor.mpc); it requires zlib.
Skipping LzoCompressor (LzoCompressor.mpc); it requires lzo1.
Skipping TAO_IDL_GEN (tao_idl_fe.mpc); it requires tao_idl_fe_gen.
Skipping NamingViewer (NamingViewer.mpc); it requires mfc.
Skipping wxNamingViewer (wxNamingViewer.mpc); it requires wxWindows.
Generation Time: 49s
MPC_ROOT was set to /home/dev/dds-test/ACE_wrappers/build/arm/MPC.
Using .../dds-test/ACE_wrappers/bin/MakeProjectCreator/config/MPC.cfg
CIAO_ROOT was used in the configuration file, but was not defined.
DANCE_ROOT was used in the configuration file, but was not defined.
Generating 'gnuace' output using DDS.mwc
Skipping ishapes (ishapes.mpc); it requires boost.
Skipping DDS_Inconsistent_Qos_Inconsistent_Qos (Inconsistent_Qos.mpc); it requires xerces.
Skipping qos_dump (qos_dump.mpc); it requires xerces.
Skipping FaceUnitTests_SafetyProfilePool (FaceUnitTests.mpc); it avoids no_opendds_safety_profile.
Skipping OpenDDS_XML_QOS_XSC_Generation (qos_xml_handler.mpc); it requires xsc.
Skipping OpenDDS_QOS_XML_XSC_Handler (qos_xml_handler.mpc); it requires xerces.
Skipping OpenDDS_Corba (OpenDDS_Corba.mpc); it avoids no_opendds_safety_profile.
Skipping OpenDDS_CorbaSeq (CorbaSeq.mpc); it avoids no_opendds_safety_profile.
Skipping tao_java (tao_java.mpc); it requires java.
Skipping builtintopics_test (builtintopics_test.mpc); it requires java.
Skipping two_idl (two_idl.mpc); it requires java.
Skipping zerocopy_java_test (zerocopy.mpc); it requires java.
Skipping multirepo_test (multirepo_test.mpc); it requires java.
Skipping hello_java_client (hello_java_client.mpc); it requires java.
Skipping transport_config (transport_config.mpc); it requires java.
Skipping complex_idl_test (complex_idl_test.mpc); it requires java.
Skipping publisher_idl_test (publisher_idl_test.mpc); it requires java.
Skipping java_both_test (java_both_test.mpc); it requires java.
Skipping messenger_idl_test (messenger_idl_test.mpc); it requires java.
Skipping subscriber_idl_test (subscriber_idl_test.mpc); it requires java.
Skipping dcps_java (dcps_java.mpc); it requires java.
Skipping idl2jni_test_simple (idl2jni_test_simple.mpc); it requires java.
Skipping idl2jni_runtime (idl2jni_runtime.mpc); it requires java.
Skipping idl2jni_compact (idl2jni_compact.mpc); it requires java.
Skipping idl2jni_codegen (idl2jni_codegen.mpc); it requires java.
Skipping dissector (dissector.mpc); it requires wireshark.
Generation Time: 31s
calling make -C ace
make: Entering directory '/home/dev/dds-test/ACE_wrappers/build/arm/ace'
make[1]: Entering directory '/home/dev/dds-test/ACE_wrappers/build/arm/ace'
touch .depend.ACE
GNUmakefile: /home/dev/dds-test/ACE_wrappers/build/arm/ace/GNUmakefile.ACE MAKEFLAGS=w

arm-linux-androideabi-g++ -Wno-deprecated-declarations -W -Wall -Wpointer-arith -Wno-psabi -fno-strict-aliasing -Wall -W -Wpointer-arith -pipe  --sysroot=/opt/crystax-ndk/sysroot -I/opt/crystax-ndk/sysroot/usr/include -I/opt/crystax-ndk/include -D_REENTRANT  -D_GNU_SOURCE -DACE_HAS_CUSTOM_EXPORT_MACROS=0  -DNDEBUG  -I/home/dev/dds-test/ACE_wrappers/build/arm -DACE_NDEBUG -D__ACE_INLINE__ -I.. -DACE_AS_STATIC_LIBS  -c  -o .obj/Local_Name_Space.o Local_Name_Space.cpp
In file included from /home/dev/dds-test/ACE_wrappers/build/arm/ace/OS_NS_Thread.h:32:0,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Thread_Mutex.h:31,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Log_Category.h:20,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Malloc.h:24,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Malloc_T.h:18,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Local_Name_Space.h:20,
                 from Local_Name_Space.cpp::
/home/dev/dds-test/ACE_wrappers/build/arm/ace/os_include/os_sched.h:47:6: error: conflicting declaration 'typedef struct cpu_set_t cpu_set_t'
    } cpu_set_t;
      ^
In file included from /opt/crystax-ndk/sysroot/usr/include/sched.h:43:0,       
                 from /opt/crystax-ndk/sysroot/usr/include/crystax/bionic/libc/include/mangled-pthread.h:33,
                 from /opt/crystax-ndk/sysroot/usr/include/pthread.h:43,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/os_include/os_pthread.h:54,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/OS_NS_Thread.h:31,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Thread_Mutex.h:31,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Log_Category.h:20,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Malloc.h:24,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Malloc_T.h:18,
                 from /home/dev/dds-test/ACE_wrappers/build/arm/ace/Local_Name_Space.h:20,
                 from Local_Name_Space.cpp:3:
/opt/crystax-ndk/sysroot/usr/include/crystax/bionic/libc/include/mangled-sched.h:73:3:note: previous declaration as 'typedef struct cpu_set_t cpu_set_t'
 } cpu_set_t;
   ^
/home/dev/dds-test/ACE_wrappers/build/arm/include/makeinclude/rules.local.GNU:188: recipe for target '.obj/Local_Name_Space.o' failed
make[1]: *** [.obj/Local_Name_Space.o] Error 1
make[1]: Leaving directory '/home/dev/dds-test/ACE_wrappers/build/arm/ace'
GNUmakefile:45: recipe for target 'ACE' failed
make: *** [ACE] Error 2
make: Leaving directory '/home/dev/dds-test/ACE_wrappers/build/arm/ace'
calling TAO_ROOT make
... (snip)

person Ender    schedule 08.06.2017    source источник


Ответы (1)


Эту проблему можно решить с помощью TAO 6.4.3 и ACE 2.4.3, которые можно загрузить с сайта Университета Вандербильта. Посмотрите INSTALL, чтобы узнать, как установить собственный ACE/TAO. version вместо того, чтобы загружать версию OCI как часть сценария настройки. Я сделал запрос на вытягивание для OpenDDS, чтобы расширить скрипт configure новой опцией пусть он загрузит ACE/TAO из Университета Вандербильта, надеюсь, это попадет в OpenDDS 3.12

person Johnny Willemsen    schedule 08.06.2017
comment
Этот обновленный файл config-android.h из ACE+TAO 6.4.3 очень помог. Хотя мне все же пришлось изменить #define ACE_LACKS_FD_MASK на #define ACE_HAS_FD_MASK, чтобы пройти компиляцию. Эта сборка лучше, чем в предыдущих версиях (т. е. тесты теперь компилируются), но не работает на FACE (что мне не нужно). И строит ТАК вместо статики. Спасибо. - person Ender; 09.06.2017
comment
Вы, вероятно, используете более новый Android NDK, чем мы тестируем. Возможно, вы можете проверить, какой уровень Android API вы используете, и создать новый запрос на включение на github.com/DOCGroup/ACE_TAO с необходимым изменением в config-android.h (проверьте уровень API, чтобы старые версии продолжали работать) - person Johnny Willemsen; 09.06.2017
comment
Вероятно, это вызвано унифицированными заголовками NDK15, см. android.googlesource.com/platform/ndk/+/ndk-r15-release/docs/. config-android.h должен быть обновлен для поддержки этого - person Johnny Willemsen; 09.06.2017
comment
Вероятно, я на самом деле использую Crystax NDK, который все еще поддерживает более новые версии GCC (Android NDK больше не поддерживает, перейдя на Clang). Я буду делать пул-реквесты, где смогу. - person Ender; 09.06.2017
comment
Мы никогда не пробовали Crystax NDK, что объясняет отсутствие поддержки в config-android.h. Надеюсь, вы скоро сможете внести необходимые дополнения (без нарушения поддержки NDK по умолчанию). - person Johnny Willemsen; 11.06.2017