指示 gnu make 只使用静态库

Posted

技术标签:

【中文标题】指示 gnu make 只使用静态库【英文标题】:Instruct gnu make to use only static libraries 【发布时间】:2015-10-09 13:54:20 【问题描述】:

这是我想做的:

有一个用 c/c++ 编写的项目,我想编译并部署到 android 设备上。

我希望这个项目引用的每个库都静态链接到整个编译,这样我就可以获得一个自包含的二进制文件(或其中的几个)。

问题一:经过搜索发现,库或多或少有两种,动态的和静态的。我的问题是,我必须提供静态库还是 gcc 工具链能够以某种方式从头文件中编译它们?

问题 2:在搜索静态链接时,我只发现了仅对有限数量的库和目标文件使用标志的示例。我想要一个递归函数。那就是“为项目中的每个库引用链接它的静态版本。如果没有这样的版本,编译并链接它(这可能吗?)

【问题讨论】:

【参考方案1】:

无法从标头编译库。你需要你需要的所有库的来源。通常,此类源带有它们的构建脚本,并且这些脚本可能允许选择静态或共享目标。不幸的是,在某些情况下,仅支持一种目标类型。

通常,我们使用它们的构建脚本单独构建第三方库(有些涉及独立的工具链,有些可能使用 CMake 进行配置,还有一些 - 随着 Android 平台的普及,它们的份额也在增加 -提供Android.mk构建脚本,使用方便的ndk-build命令编译。

无论如何,使用这些库的应用程序必须包含对所有这些库的显式引用,通常通过在其 Android.mk 中添加 include $(PREBUILT_STATIC_LIBRARY)。但是如果你在一个目录中有很多库,你可以使用 gnu-make 通配符,例如

LOCAL_LDLIBS += -Ljni/libs $(patsubst jni/libs/lib%.a,-l%,$(wildcard jni/libs/lib*.a))

【讨论】:

以上是关于指示 gnu make 只使用静态库的主要内容,如果未能解决你的问题,请参考以下文章

gcc升级后静态库要升级吗

无法使用 make 命令创建 iOS 静态库 .a 文件

当我链接动态库而不是静态库时,CMake 有效

介子找不到静态库

cmake利用toolchain.cmake生成makefile之后,make生成静态库失败问题

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)