是否有一种简单的方法可以从Android.mk
文件为Android NDK工具链的汇编程序定义符号?
我的目标是能够构建一个由几个.C和.s(汇编程序)文件组成的本机库,这些文件是为ARMV6或ARMV7A EABIS编译和调整的,只需修改APP_ABI值即可驱动所有必需的条件编译在Application.mk文件上。
首先,我成功地使用ifeq()
中可用的Android.mk
指令来查询APP_ABI值的值,然后有条件地执行构建脚本的不同部分。
然后我尝试使用此功能以有条件地注入符号(通过-D),如下所示:
# Compilation Flags
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_CFLAGS += -DTARGET_ARMEABI -marm -mtune='arm1136jf-s' -ffast-math -O3 -march=armv6 -fvisibility=hidden
else
#armeabi-v7a
LOCAL_CFLAGS += -marm -ffast-math -O3 -march=armv7-a -fvisibility=hidden
endif
C源代码文件找到正确定义的TARGET_ARMEABI符号,但是汇编程序文件没有。(我需要这样才能根据体系结构定义正确的EABI属性)。这是我尝试在汇编语言文件中有条件地定义EABI属性的示例:
.ifdef TARGET_ARMEABI
.arch armv6
.fpu softvfp
.eabi_attribute 23, 1
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 2
.eabi_attribute 18, 4
.else
.arch armv7-a
.eabi_attribute 27, 3
.fpu vfp
.eabi_attribute 23, 1
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 2
.eabi_attribute 18, 4
.endif
非常感谢任何指针或建议。
答案 0 :(得分:1)
汇编文件需要以.S
预处理的大写字母S(.sx
或gcc
)结束。请参阅GCC doc, 3.2 Options Controlling the Kind of Output。
我相信你可以从Bionic
sources作弊,例如从libc/arch-arm/bionic/memcpy.S作弊。
答案 1 :(得分:1)
要使TARGET_ARMEABI定义在程序集文件中可见,请使用' -x assembler-with-cpp '选项对其进行编译,并在程序集文件中使用标准C预处理程序 #ifdef 指令。