使用预构建的静态库进行编译

时间:2017-05-25 06:53:03

标签: c android-ndk shared-libraries

我想在我的android应用程序中使用ffmpeg,考虑到构建库的大小,我决定编写一段c代码来完成一个简单的视频任务。

我在Mac上测试了我的代码,它编译并运行正常。现在对于NDK部分,我无法成功编译,我有几个问题,并希望有人给我一个指南。

  1. 我可以使用Mac上安装的静态ffmpeg库交叉编译我的c代码吗?或者,如果我必须在使用我的代码之前交叉编译它们?
  2. 静态库的大小是10Mb,我的c代码只有几行,我的最终共享库有多大?大约10Mb?
  3. 任何解释将不胜感激

1 个答案:

答案 0 :(得分:1)

  1. 当然,静态lib需要针对相同的架构,因此也必须进行交叉编译。

  2. 这取决于静态lib的结构。静态库通常只是对象(.o)文件的存档。因此,如果您的库具有足够小的翻译单元,并且您的程序仅使用其中的一些,则只有这些将真正链接到您的可执行文件。如果您的程序库使用-ffunction-sections -fdata-sections(将所有函数和静态存储的所有对象都放在自己的段中)编译,结果可能会更小然后在链接期间传递-Wl,--gc-sections,因此任何未使用的部分都将被丢弃。另一方面,您可以在一种情况下运行,您可以调用内部需要接近所有其他库代码的lib的某些功能,因此最终几乎将整个库链接到您的可执行文件中。因此:它取决于,尝试一下,如果您关注尺寸,请尝试--gc-sections