Android NDK CMake编译汇编文件(*.s)

4
我正在使用带有cmake和Android NDK的Android Studio 2.2.2。我有一个库,其中包含几个.s(汇编)文件,我为我的项目编译这些文件。

在使用Android.mk文件时,我可以将这些文件编译/链接到我的项目中,但在使用cmake时,我遇到了编译器错误,如下所示:

lib\arm_android\armfrag.s:1:2: error: unexpected token at start of statement @******************************************************************** ^ libs\arm_android\armfrag.s:2:2: error: unexpected token at start of statement @* * ^

armfrag文件顶部有一些注释,例如:

@******************************************************************** @* * @* THIS FILE IS ...................................................................................

从这里我认为我的cmake无法读取这些汇编文件,但是注释并不是唯一的问题,因为我删除了注释后仍然会收到错误消息。

我的cmake看起来像这样:

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_VERBOSE_MAKEFILE on)

set(can_use_assembler TRUE)
enable_language(ASM)

add_definitions(-DANDROID -DNDEBUG -DOC_ARM_ASM)

add_library(omnitus STATIC
    ../../../../libs/lib/arm_android/armbits.s 
    ../../../../libs/lib/arm_android/armfrag.s 
    ../../../../libs/lib/arm_android/armidct.s 
    ../../../../libs/lib/arm_android/armloop.s 
    ../../../../libs/lib/arm/armopts-gnu.s              
)

target_include_directories(omnitus PUBLIC
    ../../../../libs/include
)

target_include_directories(omnitus PUBLIC
    ../../../../libs/lib/arm
)

target_include_directories(omnitus PUBLIC
    ../../../../libs/include
)

有人知道为什么这在cmake中失败而在旧的Android.mk文件中可以正常工作吗?

干杯

* 添加 *

使用详细模式,我会得到相同的错误,但还会添加以下内容:

Android clang version 3.8.256229  (based on LLVM 3.8.256229)
Target: x86_64-unknown-linux
Thread model: posix
InstalledDir: C:\Android\sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin
clang.exe: warning: argument unused during compilation: '-D ANDROID'
clang.exe: warning: argument unused during compilation: '-D ARM'
clang.exe: warning: argument unused during compilation: '-D NDEBUG'
clang.exe: warning: argument unused during compilation: '-D OC_ARM_ASM'  
clang.exe: warning: argument unused during compilation: '-MD'
clang.exe: warning: argument unused during compilation: '-MT      CMakeFiles/omnitus.dir/lib/arm/armopts-gnu.s.o'
clang.exe: warning: argument unused during compilation: '-MF CMakeFiles\omnitus.dir\lib\arm\armopts-gnu.s.o.d'

* Added modified cmake file *

cmake_minimum_required(VERSION 3.4.1)

set(CMAKE_VERBOSE_MAKEFILE on)

set(can_use_assembler TRUE)
enable_language(ASM)

add_definitions(-v -DANDROID -DNDEBUG -DOC_ARM_ASM)

if(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7-a)
set(TEST_SOURCES ../../../../libs/lib/arm_android/armbits.s 
               ../../../../libs/arm_android/armfrag.s
               ../../../../libs/arm_android/armidct.s 
               ../../../../libs/arm_android/armloop.s
               ../../../../libs/lib/arm/armopts-gnu.s       
               )
endif()

add_library(omnitus STATIC ${TEST_SOURCES}              
)

target_include_directories(omnitus PUBLIC
    ../../../../libs/include
)

target_include_directories(omnitus PUBLIC
    ../../../../libs/arm
)

target_include_directories(omnitus PUBLIC
    ../../../../libs/include
)

你确定你的库只是为ARM构建的吗? - Michael
@Michael - 是的,我已经在我的gradle文件中指定了abiFilters 'armeabi-v7a',并在Cmake中使用了我的ARM定义。 - Adrian Ivasku
你能否在你的标志中添加“-v”,并检查当clang被调用来汇编你的汇编文件时是否会得到一行说“Target: bla bla bla”的输出?它声明了什么目标? - Michael
@Michael - 没有错误,只是这是一个补充。请查看更新的答案。在此处写太长了。 - Adrian Ivasku
好像不对(目标是x86_64-unknown-linux)。你是否尝试根据CMAKE_SYSTEM_PROCESSOR有条件地添加汇编源,就像这个例子中所示的那样? - Michael
显示剩余2条评论
1个回答

0

目前,对于ARMv7和ARMv8架构,您必须以内联汇编的方式在C源文件中编写汇编代码。

Android Studio刚刚为x86和x86-64架构添加了YASM汇编器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接