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

时间:2018-07-23 09:55:57

标签: android clang static-libraries symbols

使用--exclude-libs选项可以在将gcc用作编译器时隐藏符号。

一个工作示例:

我的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?

我已经尝试了以下链接中的建议

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

但这似乎没有任何作用。

修改源代码和使用Clang的LTO Visibility属性不是一个选择。

1 个答案:

答案 0 :(得分:0)

您链接到的页面正确。 --exclude-libs是链接器选项,即使使用Clang进行编译,GCC仍用于链接。从NDK文档中:

  

还包括GCC二进制文件,因为Clang依赖于GCC发行版中包含的同一汇编程序,链接器,标头和库。

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

最不适合您的原因是归档文件的实际文件名不是library.a(例如,可能是liblibrary.a或类似名称)。