如何从 C++ 代码生成 arm64-v8a 64 位共享对象?
How to generate arm64-v8a 64bit shared object from c++ code?
我在我的 android 应用程序上使用 C++ 库已有一段时间了,但它一直在使用 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++ 代码库中触及的全部内容图书馆所以我不太确定现在所有的作品都在哪里。
您在
使用预建库
../lib/libfftw3.a
您还必须为 arm64 构建 fftw3。通常我们有
LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libfftw3.a
这样 ndk-build 就可以选择第 3 方库的正确变体。
为 arm64 构建 fftw3 的说明可用 on GitHub。
我在我的 android 应用程序上使用 C++ 库已有一段时间了,但它一直在使用 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++ 代码库中触及的全部内容图书馆所以我不太确定现在所有的作品都在哪里。
您在
使用预建库../lib/libfftw3.a
您还必须为 arm64 构建 fftw3。通常我们有
LOCAL_SRC_FILES := ../lib/$(TARGET_ARCH_ABI)/libfftw3.a
这样 ndk-build 就可以选择第 3 方库的正确变体。
为 arm64 构建 fftw3 的说明可用 on GitHub。