指示 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 只使用静态库的主要内容,如果未能解决你的问题,请参考以下文章