gpt4 book ai didi

c++ - ar : not keeping file modification times

转载 作者:行者123 更新时间:2023-11-30 04:45:40 26 4
gpt4 key购买 nike

我有一个运行 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)选项以强制构建符号表?

最佳答案

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

-D 选项用于“确定性”模式,使存档中文件的 UID、GID 和修改时间都为 0(并且它对所有文件使用一致的文件模式)。替代方案是 -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 选择将其设为默认 - 我认为这一决定无益且适得其反。

关于c++ - ar : not keeping file modification times,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com