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

问题描述 投票:0回答:1

我正在努力使用 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 文件,即使我将其包含在我的 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
c android-ndk
1个回答
0
投票

c 文件和汇编文件不能同名。因此,将汇编文件更改为

test_asm.S
可以编译可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.