在 Windows 上使用 clang 构建 Android NDK 时出错

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

目前我正在尝试为 Android 构建一个 C 共享库。我已经安装了 Android StudioNDK(并排),但必须使用另一个构建工具(过时版本的 Qbs,在许多代码位置进行了修补)来构建它。这是我无论如何都无法避免的事情。

所以,我提出了以下任务:有一个C语言目标文件,my_api.c.o(可以认为是静态库),我需要构建一个共享库文件,libmyapi.so ,也是用 C 语言 表示的。它只是一个空白的 *.c 文件。

库的使用预计如下:Android 应用程序 myapplication.apk(用 Java 或 Kotlin 编写)引用 JAR 文件 myapi.jar(仅包装器),其中包含 JNI 共享库文件 libjnimyapi。 so(Java 运行时到本机、稳定的接口),它使用本机共享库 libmyapi.so(仅限本机运行时,不稳定的实现)。

现在我被以下的 clang 调用所困扰。尝试在主机 Windows x86-64上构建目标 Android x86-64,我的构建系统调用(仅用新行替换空格):

C:\Users\USER\AppData\Local\Android\Sdk\ndk\26.1.10909125\toolchains\llvm\prebuilt\windows-x86_64\bin\\clang.exe
"-Wl,-soname=libmyapi.so,--as-needed,-m,elf_x86_64,-rpath,$ORIGIN,-z,noexecstack,-z,relro,-z,now"
-shared
"--sysroot=C:\Users\USER\AppData\Local\Android\Sdk\ndk\26.1.10909125\/toolchains/llvm/prebuilt/windows-x86_64/sysroot"
-LC:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/x86_64-linux-android
-LC:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/x86_64-linux-android/26
-no-canonical-prefixes
-target
x86_64-none-linux-android
-o
D:/Repo/myapi/build/android-x86_64/debug/myapi-shared.53ad79c4/libmyapi.so
D:/Repo/myapi/build/android-x86_64/debug/myapi-shared.53ad79c4/ef09f097fcee0ffa/blank.c.o
D:/Repo/myapi/build/android-x86_64/debug/myapi-shared.53ad79c4/my_api.c.o
-ldl
-lc
-lm

它会导致错误:

ERROR: ld.lld: error: cannot open crtbegin_so.o: No such file or directory
ld.lld: error: cannot open crtend_so.o: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ERROR: Process failed with exit code 1.

尽管需要的文件在那里:

C:\Users\USER\AppData\Local\Android\Sdk\ndk\26.1.10909125\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\lib\x86_64-linux-android\26

27.11.2023  16:13    <DIR>          .
27.11.2023  16:13    <DIR>          ..
14.11.2023  10:24             3 104 crtbegin_dynamic.o
14.11.2023  10:24             3 288 crtbegin_so.o
14.11.2023  10:24             3 104 crtbegin_static.o
14.11.2023  10:24             1 024 crtend_android.o
14.11.2023  10:24               696 crtend_so.o

使用 -v 选项单独执行

clang
(不是从构建系统),我得到:

"C:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/bin/ld.lld"
"--sysroot=C:\\Users\\USER\\AppData\\Local\\Android\\Sdk\\ndk\\26.1.10909125\\/toolchains/llvm/prebuilt/windows-x86_64/sysroot"
-z
now
-z
relro
--hash-style=both
--eh-frame-hdr
-m
elf_x86_64
-shared
-o
D:/Repo/myapi/build/android-x86_64/debug/myapi-shared.53ad79c4/libmyapi.so
crtbegin_so.o
-LC:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/x86_64-linux-android
-LC:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/x86_64-linux-android/26
-LC:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/x86_64
"-LC:\\Users\\USER\\AppData\\Local\\Android\\Sdk\\ndk\\26.1.10909125\\/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/x86_64-linux-android"
"-LC:\\Users\\USER\\AppData\\Local\\Android\\Sdk\\ndk\\26.1.10909125\\/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib"
-soname=libmyapi.so
--as-needed
-m
elf_x86_64
-rpath
"\$ORIGIN"
-z
noexecstack
-z
relro
-z
now
D:/Repo/myapi/build/android-x86_64/debug/myapi-shared.53ad79c4/ef09f097fcee0ffa/blank.c.o
D:/Repo/myapi/build/android-x86_64/debug/myapi-shared.53ad79c4/my_api.c.o
-ldl
-lc
-lm
C:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/libclang_rt.builtins-x86_64-android.a
-l:libunwind.a
-ldl
-lc
C:/Users/USER/AppData/Local/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/lib/clang/17/lib/linux/libclang_rt.builtins-x86_64-android.a
-l:libunwind.a
-ldl
crtend_so.o

这给了我一些信息,我设法谷歌搜索这个订单,无论如何,这似乎没问题,以及这个

-B
选项,这没有帮助,似乎也不是必需的......

我有什么遗漏的吗?看起来 my_api.c.o 已正确编译,但链接到 libmyapi.so 失败。 Android NDK 中是否有任何奇怪的限制,例如工具链设计无法构建纯 C(而非 C++)共享库?论点定位(尤其是

-L
)重要吗?

提前致谢!

android android-ndk clang cross-compiling
1个回答
0
投票

事实证明我的构建工具(过时版本的 Qbs)无法处理

-target
选项正确。当它使用
x86_64-none-linux-android
时,Android NDK API 级别缺失。更正此构建工具的代码以添加缺失的数字后,我设法使用 x86_64-none-linux-android27 构建
clang
,并且库成功构建。

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