Как создать общий 64-битный объект arm64-v8a из кода C ++? - PullRequest
1 голос
/ 01 июня 2019

Я уже некоторое время использую библиотеку c ++ в своем приложении для Android, но она использует 32-битную версию. Я пытаюсь сейчас скомпилировать библиотеку c ++ в 64-битный .so файл, но каждый раз, когда я делаю ndk-build, я вижу, что armeabi-v7a генерируется успешно, но когда arm64-v8a пытается скомпилировать, это дает сбой и дает мне следующее сообщение об ошибке:

libfftw3.a: error adding symbols: File in wrong format collect2: error: ld returned 1 exit status

Я собираюсь разместить ниже своих Application.mk и Android.mk соответственно, чтобы показать, что я сделал, чтобы попытаться сделать это правильно.

Application.mk

APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION=4.9
APP_CPPFLAGS += -frtti
APP_PLATFORM := android-23
APP_CPPFLAGS += -std=c++11
APP_ABI := armeabi-v7a arm64-v8a
APP_MODULES := SCCpp

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
CXXFLAGS += -arch x86_64 -arch i386
LOCAL_MODULE := fftw3
LOCAL_SRC_FILES := ../lib/libfftw3.a
LOCAL_EXPORT_C_INCLUDES = $(LOCAL_PATH)/..
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

GLOBAL_C_INCLUDES := \
  $(LOCAL_PATH)/../src

LOCAL_SRC_FILES += ../src/d/re.cpp
LOCAL_SRC_FILES += ../src/d/me.cpp
LOCAL_SRC_FILES += ../src/d/ev.cpp
LOCAL_SRC_FILES += ../src/d/fe.cpp
LOCAL_SRC_FILES += ../src/fft/fourier.cpp
LOCAL_SRC_FILES += ../src/nu/ac.cpp
LOCAL_SRC_FILES += ../src/nu/st.cpp
LOCAL_SRC_FILES += ../src/utils/converter.cpp
LOCAL_SRC_FILES += ../src/sci.cpp

LOCAL_MODULE := SCCpp
LOCAL_MODULE_FILENAME := libSCCpp

LOCAL_STATIC_LIBRARIES := fftw3

LOCAL_CPP_FEATURES += exceptions
LOCAL_CFLAGS += -fopenmp
LOCAL_CFLAGS += -Ofast
LOCAL_LDFLAGS += -fopenmp -t
LOCAL_CPPFLAGS :=  -std=c++11
LOCAL_LDLIBS += -latomic -llog
LOCAL_C_INCLUDES := $(GLOBAL_C_INCLUDES) $(LOCAL_PATH)/../../../3rdParty/fftw-3.3.4-dll32/
LOCAL_EXPORT_CPPFLAGS := -fexceptions -frtti

include $(BUILD_SHARED_LIBRARY)

Я действительно незнаком со всем этим процессом, поэтому нахожусь в тупике, тем более что журналы ничего мне вообще не говорят. Я думал, что простое добавление arm64-v8a автоматически сгенерирует 64-битный общий объект. Есть пропущенный шаг?

Если есть какая-то недостающая информация, которую я должен предоставить, пожалуйста, спросите в комментариях, чтобы я мог дать более подробную информацию, но на данный момент в моей текущей позиции это все, что я коснулся в кодовой базе для библиотеки c ++, так Я не совсем уверен, где все части в данный момент.

1 Ответ

1 голос
/ 01 июня 2019

Вы используете готовую библиотеку на

../lib/libfftw3.a

Вы должны собрать fftw3 и для arm64. Обычно у нас есть

 LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libfftw3.a

чтобы ndk-build мог выбрать правильный вариант сторонней библиотеки.

Инструкции по сборке fftw3 для arm64 доступны на GitHub .

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