无法使用ndk-build脚本将.S和.c文件编译为可执行文件

ct2axkht  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在努力用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

ztigrdn8

ztigrdn81#

c文件和汇编文件不能共享相同的名称。因此,将汇编文件更改为test_asm.S允许编译可执行文件。

相关问题