【问题标题】:ar: not keeping file modification timesar:不保留文件修改时间
【发布时间】:2019-07-22 16:40:29
【问题描述】:

我有一个运行 Ubuntu 16.4 LTS 的 docker 实例。我正在做 C++ 构建并使用 ar/ranlib 来生成我的 .a 文件。这会丢失文件修改时间。

这是我管理存档文件的 Makefile 规则:

${LIB}: ${LIB_OBJ}
    ar -cvr ${LIB} ${LIB_OBJ}
    ranlib ${LIB}

之后还有一点输出:

^ ar tv libmylib.a
rw-r--r-- 0/0 129000 Jan  1 00:00 1970 XMLStringWriter.o
rw-r--r-- 0/0  99664 Jan  1 00:00 1970 FileUtilities.o
...

^ ar --version
GNU ar (GNU Binutils for Ubuntu) 2.26.1
^ ranlib --version
GNU ranlib (GNU Binutils for Ubuntu) 2.26.1

系统时间正确,.o 文件有正确的更新时间。此外,我为在 Mac 上运行执行相同的构建,生成的 libmylib-mac.a 具有正确的更新时间,具有完全相同的 Makefile,只是不同的 LIB 目标。

这不会造成任何实际问题,但很烦人。我没有看到用于 ar 命令的选项,并且网络搜索没有找到明显的讨论。

解决方案?

另外,我是否应该取消 ranlib 命令并添加 -s(小写 s)选项来强制构建符号表?

【问题讨论】:

  • 您的文件系统是否安装了“noatime”或“relatime”选项,而ar 正在使用atime?只是在黑暗中的疯狂猜测..
  • @JesperJuhl 我会考虑 ar 命令的这种可怕行为。我做了 ls -l --time=atime,时间似乎很合理。
  • 正如我所说,这只是一个猜测。在黑暗中开枪????
  • @JesperJuhl 值得一试。谢谢。

标签: c++ unix-ar


【解决方案1】:

Ubuntu 有一个奇妙的想法,将-D 选项设为ar 的默认选项是个好主意。 AFAICS,这是一个彻头彻尾的麻烦事,因为对我没有任何好处的东西打破了 40 多年的 Unix 历史——这很烦人。

-D 选项用于“确定性”模式,并使存档中文件的 UID、GID 和修改时间全部为 0(并且它对所有文件使用一致的文件模式)。另一种选择是-U,表示“不要在确定性模式下运行”。似乎没有可以设置为在模式之间进行选择的环境变量或类似变量。

实际上,它可能不仅仅是 Ubuntu — 有关说明,请参阅ar(1) 的 Linux 手册。但是,Linux 手册中提到:

如果 binutils 配置了--enable-deterministic-archives, 那么这个模式是默认开启的。可以使用U 禁用它 修饰符,下面。

事实上,Ubuntu 手册也有同样的文字,但 Ubuntu 选择将其设为默认值——我认为这个决定无益且适得其反。

【讨论】:

  • 哦,这本来是不明显的,但它确实有效。谢谢! ar -cvrU ${LIB} ${LIB_OBJ}
  • 正如你所知道的,@JosephLarson,我发现了一个艰难的方法,并且发现它并不高兴。我很高兴将这个消息转达给遇到它的人。这个想法是您将始终构建整个库或不构建库,但是当我运行 make 时,它​​认为库中的目标文件都已经过时 w.r.t 源代码,所以它总是重建整个库。我不太喜欢那样。也许它有利于发行版;不过,我认为它不会使大多数发行版用户受益——我现在必须为 Ubuntu 上的 ar 与其他任何地方设置不同的标志。脾气暴躁!
  • 我宁愿获得一致的结果,也不愿将文件修改时间 inside 存档。你用这些时间做什么?
  • @LightnessRacesinOrbit — make 使用存档中的时间戳来了解存档的该成员是否与其源是最新的。使用“确定性”存档,存档中的目标文件总是过时的,所以整个存档总是需要重建,颠覆了make 的设计初衷——避免不必要的重新编译。显然它必须适合某人。但这让我很生气。
  • @JonathanLeffler 啊,这很有道理 :) 出于某种原因,我想象 make 会将存档自己的时间与其依赖项的时间进行比较
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2016-08-19
  • 2018-07-02
相关资源
最近更新 更多