我如何在 android ndk 上 link C 和 C++ 代码以及 C 和 C++ 运行时库(包括 STL)?

How can I link both C and C++ code, along with C and C++ runtime libraries (including STL) on android ndk?

我有一个混合了 C 和 C++ 代码的大型代码库。它被内置到库中,然后最终成为 运行 在基于 android 的设备上的可执行文件。这是一个不使用 gradle 的 "external build system"。在构建所有编译和库之后,最终的 link 命令类似于

armv7a-linux-androideabi30-clang++ -pie -static-libstdc++ -o a.out -L...-lmylib1 -lmylib2 -lm -llog

当程序为运行时,我得到"cannot locate symbol fread_unlocked"。当我使用 -### 查看引擎盖下 link 命令的扩展时,clang++ 会自动在其他库中添加 -lc 和 -lgcc(否则,我会自己添加它们)。

或者,我已经尝试 link 将 c++ 标准库(stl 标准库,libc++)插入到 C linker

armv7a-linux-androideabi30-clang -o a.out -L...-lmylib1 -lmylib2 -lm -llog -lc++

当程序执行时,我得到"cannot find libc++_shared.so"。我不想随我的应用程序一起复制任何共享库,所以我更喜欢静态 linked 的 c++ 库,但我看不到使用 clang 来做到这一点的方法。如果我尝试使用 -static 静态 link 整个内容,那么它就无法找到 liblog 等的静态版本。而且我确认最新的ndk中没有liblog.a(只有liblog.so)。

所以,我相信我的基本需求是 link C 和 C++ 代码的混合,以及 C 和 C++ 运行 次,并且没有对目标的共享库依赖。

我正在为 API 30 和 运行 构建一个较旧的目标。我将 link 命令更改为 arm v7a-linux-androideabi 23-clang 并且它起作用了。