我正在努力用ndk-build将.c和.S文件编译成一个可执行文件:
me@pc:~/temp/mydir$ /home/me/android-ndk-r21e/ndk-build V=3 NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk NDK_APPLICATION_MK=Application.mk
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16.
/home/me/android-ndk-r21e/build/core/build-binary.mk:475: warning: overriding recipe for target 'obj/local/arm64-v8a/objs/test_mod/src/test.o'
/home/me/android-ndk-r21e/build/core/build-binary.mk:474: warning: ignoring old recipe for target 'obj/local/arm64-v8a/objs/test_mod/src/test.o'
/home/me/android-ndk-r21e/build/core/build-binary.mk:475: warning: overriding recipe for target 'obj/local/arm64-v8a/objs/test_mod/src/test.o.commands.json'
/home/me/android-ndk-r21e/build/core/build-binary.mk:474: warning: ignoring old recipe for target 'obj/local/arm64-v8a/objs/test_mod/src/test.o.commands.json'
[arm64-v8a] Compile : test_mod <= test.S
[arm64-v8a] Executable : test_mod
./obj/local/arm64-v8a/objs/test_mod/src/test.o: In function `assembly_func':
/home/me/temp/mydir/./src/test.S:9: multiple definition of `assembly_func'
./obj/local/arm64-v8a/objs/test_mod/src/test.o:/home/me/temp/mydir/./src/test.S:9: first defined here
/home/me/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o: In function `_start_main':
crtbegin.c:(.text+0x38): undefined reference to `main'
crtbegin.c:(.text+0x3c): undefined reference to `main'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/me/android-ndk-r21e/build/core/build-binary.mk:738: obj/local/arm64-v8a/test_mod] Error
字符串
我假设undefined reference to main
的结果来自编译我的.c文件,其中包含main函数,即使我在Android.mk中包含它:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test_mod
LOCAL_C_INCLUDES := inc/
LOCAL_SRC_FILES := \
src/test.c \
src/test.S
include $(BUILD_EXECUTABLE)
型
试验c:
#include <stdio.h>
#include "test.h"
int main(){
printf("main has been entered.\n");
int func = assembly_func();
return func;
}
型
测试S:
#include "test.h"
.global assembly_func
.section .text
assembly_func:
mov x0, #MY_NUM
ret
型
测试h:
#define MY_NUM 7
#ifndef __ASSEMBLER__
uint32_t assembly_func();
#endif
型
1条答案
按热度按时间ztigrdn81#
c文件和汇编文件不能共享相同的名称。因此,将汇编文件更改为
test_asm.S
允许编译可执行文件。