使用 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
或类似名称)。
当 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
或类似名称)。