【问题标题】:Why does linking against a .a file require a .o file (Android Build)为什么链接到 .a 文件需要 .o 文件(Android Build)
【发布时间】:2014-07-29 00:14:26
【问题描述】:

这可能是 Android 特有的问题,我不知道。

我有一个 .a 文件,它是构建的结果(具体来说是 V8 构建)。从here 开始,我认为 .a 文件是“档案”,因此包含目标文件中的相关位。因为我认为它们是档案,所以我将它们移动到另一台机器上,用于我的 Android 特定版本。但是,当我尝试构建 android 本机库时,出现以下错误:

错误:无法打开/data/v8_3_26/out/android_arm.release/obj.target/v8_base.arm/src/api.o:没有这样的文件或目录

如果我明确复制 .o 文件(并将它们放在上面显示的硬编码路径中),我的 Android 构建工作正常。所以我有几个问题。

  1. 这只是 Android 特定的东西,还是 .a 文件只是引用 .o 文件?
  2. 我能否创建一个实际包含来自 .o 文件的相关位的 .a 文件?
  3. 如果不是,我真的必须将 .o 文件放在它们在构建机器上的相同位置,还是可以在链接步骤中指定?

1.o files vs .a files

【问题讨论】:

  • 我不确定,但如果我不得不猜测,我会说您的 android 本机库的构建配置配置为查找个人目标文件,而不是静态库 (.a文件)。您需要查看这些配置文件以确保它看起来链接到静态库而不是单个目标文件。
  • ar -rcs MyLib *.o 将归档您需要的所有文件。如果您的 .a 文件不包含正确的 .o 文件,请将其解压缩并使用 .o 文件重建它。例如,如果 .a 文件不属于构建它的项目,就会发生这种情况。示例:针对 libpng.a 的链接要求您还拥有 libz.a(包含 libpng 的所有 .o 依赖项)。要将它们合二为一,您可以提取两者并重建存档。这也可能发生在 GDI、WinAPI 等。您的编译器不会将其他 .a 文件中的 .o 文件复制到您的文件中。

标签: c++ android-ndk


【解决方案1】:

这实际上是this question 的副本。不过,我会在这里提供更多信息。

根据ar documentation,归档文件(.a 文件)可以是普通文件,也可以是精简文件。在“瘦”的情况下,档案实际上并不包含存档文件的内容。

相反,当 .a 档案是精简档案时,它包含符号索引和对档案成员文件原始副本的引用。

在 V8 构建的情况下,档案很薄,因此不包含目标文件。这就是链接器运行时 ld 需要它们的原因。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2015-09-19
    • 2011-10-20
    相关资源
    最近更新 更多