ar:不保留文件修改时间

ar: not keeping file modification times

我有一个 docker 实例 运行 Ubuntu 16.4 LTS。我正在进行 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)选项以强制构建符号 table?

Ubuntu 有一个绝妙的想法,即让 -D 选项成为 ar 的默认选项是个好主意。 AFAICS,这完全是令人讨厌的事情,为了对我没有任何好处的东西打破了 40 多年的 Unix 历史——这非常令人讨厌。

-D选项用于'deterministic'模式,使存档中文件的UID、GID和修改时间都为0(并且对所有文件使用一致的文件模式)。 'do not operate in deterministic mode' 的备选方案是 -U。似乎没有可以设置为在模式之间进行选择的环境变量或类似变量。

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

If binutils was configured with --enable-deterministic-archives, then this mode is on by default. It can be disabled with the U modifier, below.

事实上,Ubuntu 手册有相同的词,但 Ubuntu 选择将其设为默认值 — 我认为这个决定没有帮助 counter-productive。