使用 Clang 作为编译器构建 Android 项目时隐藏静态库中的符号

Hiding symbols from static library when building an Android project with Clang as compiler

当 gcc 用作编译器时隐藏符号可以使用 --exclude-libs 选项来完成。

一个工作示例:

我的 Application.mk 文件如下所示:

APP_ABI := all
APP_STL=c++_static
APP_PLATFORM := android-21
TARGET_PLATFORM := android-21
NDK_TOOLCHAIN_VERSION := 4.9

Android.mk 文件中的以下行完成了这项工作:

LOCAL_LDFLAGS += -Wl,--exclude-libs=library.a

如果我从 Application.mk 文件中删除以下行

NDK_TOOLCHAIN_VERSION := 4.9

我相信 Clang 被用作默认编译器,它似乎没有 --exclude-libs 选项,所以来自 library.a 的符号不再被隐藏。

是否有与 gcc --exclude-libs 选项等效的 Clang?

下面的建议我已经试过了link

http://lists.llvm.org/pipermail/cfe-dev/2013-June/030376.html

不过这个好像没什么效果

修改源代码并利用 Clang 的 LTO 可见性 属性 不是一种选择。

您链接的页面是正确的。 --exclude-libs 是一个链接器选项,即使你用 Clang 编译,GCC 仍然用于链接。来自 NDK 文档:

GCC binaries are also included, because Clang relies on the same assembler, linker, headers, libraries included in the GCC distribution.

因此,LOCAL_LDFLAGS += -Wl,--exclude-libs,library.a 应该有效(请注意 , 而不是 =)。我已经验证它在 CMake 项目中确实有效(它使用略有不同的语法,但设置了完全相同的链接器选项)。

这对您不起作用的最可能原因是您存档的实际文件名不是 library.a(例如,它可能是 liblibrary.a 或类似名称)。