Android-NDK: incompatible target while linking ZeroMQ static library into a shared library

2

I have successfully compiled multiple static libraries with the ndk toolchain and linked them into my own project. I have to use many cpp files and they need protocol buffers and a ZeroMQ, as a library, to compile successfully. Linking against protocol buffers works great, however, when I link against the ZeroMQ I get the following error:

C:/Users/x/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-  x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-   androideabi/bin/ld.exe: error: ./zmq/lib/libzmq.a(libzmq
_la-zmq.o): incompatible target
collect2.exe: error: ld returned 1 exit status
make.exe: *** [C:/Users/x/Workspace/y/app/src/main//obj/local/armeabi-  v7a/libZ.so] Error 1

I have replaced personal information with x, y, z for a clear reason.

I'm using Windows 8.1 with Android Studio 1.1 RC1 and NDK10d. I compiled the libraries on a Ubuntu and a Debian system (tried different ones). Both use the same arm toolchain.

To compile ZeroMQ I followed the steps from the official page. I tried zeromq3-x and zeromq4-x. I tried the mentioned ndk8 and the new ndk10d.

My Application.mk:

APP_STL := gnustl_static     #tried: c++_static/shared stlport_static/shared
APP_PLATFORM := android-21
APP_USE_CPP0X := true  #tried to omit
APP_CXXFLAGS := -std=gnu++11
APP_CPPFLAGS := -frtti -fexceptions --std=c++11
APP_ABI := armeabi-v7a             #tried different like armeabi, all, x86 - obviously only arm should work
NDK_TOOLCHAIN_VERSION := 4.9

Android.mk without important files to compile because it will crash on the first need of zmq:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := ../jni/protobuf
LOCAL_SRC_FILES := ../jni/protobuf/libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES :=      C:\Users\x\Android\Proto\.lib arm 5  2.6\protobuf-2.6.0\build\include
LOCAL_EXPORT_C_INCLUDES :=    C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf- 2.6.0\build\include\google
LOCAL_EXPORT_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-   2.6.0\build\include\google\proto
LOCAL_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-  2.6.0\build\include
LOCAL_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-2.6.0\build\include\google
LOCAL_C_INCLUDES := C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-2.6.0\build\include\google\protobuf

include $(PREBUILT_STATIC_LIBRARY)

LOCAL_MODULE := zmq
LOCAL_SRC_FILES := zmq/lib/libzmq.a  
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES := C:\Users\x\Android\ZMQ\ARM-FINAL\include
LOCAL_EXPORT_C_INCLUDES := zmq/include
LOCAL_C_INCLUDES := C:\Users\x\Android\ZMQ\ARM-FINAL\include
LOCAL_C_INCLUDES := zmq/include

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Z
LOCAL_CFLAGS := -I/zmq -std=c++11
LOCAL_CPPFLAGS := -I/zmq -std=c++11
LOCAL_CPP_FEATURES += exceptions
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
LOCAL_CPP_EXTENSION := .cxx .cpp .cc .h
LOCAL_DISABLE_FORMAT_STRING_CHECKS := true

LOCAL_SRC_FILES := \
    ../jni/protogen/applications.pb.cc \ # this will work
    common/bytearray.cpp \ # this will fail


LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

 LOCAL_C_INCLUDES += C:\Users\x\Android-MasterUI\app\src\main\jni
 LOCAL_C_INCLUDES += ../jni/protogen
 LOCAL_C_INCLUDES += common
 LOCAL_C_INCLUDES +=   C:\Users\x\Android\ZMQ\ARM-FINAL\include
 LOCAL_C_INCLUDES += C:\Users\x\Workspace\\app\src\main\jni\protobuf
 LOCAL_C_INCLUDES += C:\Users\x\Workspace\Android-    MasterUI\app\src\main\jni\protobuf\include
 LOCAL_C_INCLUDES += C:\Users\x\Android-  MasterUI\app\src\main\jni\protobuf\include\google
 LOCAL_C_INCLUDES +=   C:\Users\x\Android\Proto\.lib arm 5   2.6\protobuf-2.6.0\build\include
 LOCAL_C_INCLUDES += C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf- 2.6.0\build\include\google
 LOCAL_C_INCLUDES += C:\Users\x\Android\Proto\.lib arm 5 2.6\protobuf-2.6.0\build\include\google\protobuf

 LOCAL_STATIC_LIBRARIES := zmq protobuf

 include $(BUILD_SHARED_LIBRARY)

The objdump from the static library looks like this

libzmq_la-address.o:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000

I will omit the further ones because they are all the same. There was a better way to dump all the pieces of information with more details about the architecture, but I can not find it anymore.

If you know a better way you may tell me and I will add more information.

Any idea is welcome and appreciated...

android
android-ndk
shared-libraries
static-libraries
zeromq
asked on Stack Overflow Mar 5, 2015 by Matthias • edited Mar 5, 2015 by user3666197

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0