在远程Linux机器上编译C ++-“检测到时钟偏斜”警告


168

我通过PuTTY和WinSCP连接到我大学的小型Linux集群,使用后者传输文件,并使用前者进行编译和运行。到目前为止,我的工作是在大学的实验室中进行的,但今天我一直在家里做一些工作,产生了有趣的警告。

我上载了整个文件夹,在运行make命令后,将其作为输出的最后一行:

make:警告:检测到时钟偏斜。您的构建可能不完整。

生成的二进制文件正确运行,并且在构建过程中似乎没有任何其他意外错误。

我似乎能够通过在上传一些新的/替换文件后生成该错误来触发错误(我先在本地编辑所有内容,然后上传新版本),所以我想知道这是否与不匹配的文件修改时间一样简单?还是更多有关?

所以,我应该担心吗?如何解决/预防这个问题?


如一些答案中所述,时钟差异是可能的。您还可以比较复制前后的源文件修改时间-您可能会发现它们相差一个小时,这是因为两个OS /文件系统对待夏时制的方式有所不同。
史蒂夫·杰索普

最后一个建议:我没有任何Windows计算机,因此我对PuTTY和WinSCP的功能不熟悉,但是文件传输工具通常具有允许您控制是否保留修改的时间的选项。您的mod时间显然是保留的,但是如果您可以将其关闭,则在将文件复制到系统时,它们将使用系统时钟(而不是远程系统时钟)设置的mod时间。
MadScientist

Answers:


206

该消息通常表明您的某些文件的修改时间晚于当前系统时间。由于make通过检查源文件是否比其目标文件更新得更早来决定在执行增量构建时要编译哪些文件,因此这种情况可能导致生成不必要的文件,或更糟糕的是,没有生成必要的文件。

但是,如果要从头开始构建(不进行增量构建),则可能会忽略此警告而不会产生任何后果。


4
群集似乎我的桌面了3 分钟,因此文件可能在“未来”被修改了。那么最安全的选择是在上传任何内容之后等待5分钟左右才能运行构建吗?我宁愿不必等待,因此是否可以通过某种方法来重置任何已上传的“未来”文件的时间来避免该问题?
DMA57361 2010年

14
@ DMA57361:touch *将mtimes 更新为当前时间。或者,您可以在桌面上启用NTP来同步时钟(假设是您的桌面有问题,而不是Uni的计算机...如果是Uni的计算机,如果是后者,则可能要求系统管理员对其进行修复?)
caf 2010年

2
谢谢你,touch *现在是这样,我将看看我是否可以找出问题所在,并且下次我在现场时可能会和管理员打个招呼。
DMA57361 2010年

1
我需要在我的情况递归触摸:find . -exec touch {} \;
AMS

8
@AaronS对于这样的命令touch可以接受多个文件来执行操作,您可以(非常)有效地执行find . -exec touch {} +此操作,并touch使用尽可能多的参数进行调用。
维克多·达尔

56

通常,这是在NFS挂载目录中构建时发生的,并且客户端和NFS服务器上的时钟不同步。

解决方案是在NFS服务器和所有客户端上都运行NTP客户端。


1
我没有在任何NFS挂载的目录上构建。
kingsmasher11年

让我知道您是否可以提供一些提示来阻止此类警告,因为它实际上对执行或结果没有任何影响。
kingsmasher11年

@ kingsmasher1:在所有涉及的计算机上运行NTP客户端。
janneb

我刚刚检查了目标。日期尚未设定。我不确定如何在此处运行NTP。可以,如果我更新日期,可以吗?我在其中建立的x86设置为当前日期,但是我的目标(在其中执行)的日期为1970年代。
kingsmasher11年

1
问题已解决。我将目标日期更改为当前日期,警告消失了。因此问题是:如果目标日期是比可执行日期还晚的日期,则会发生此问题。
kingsmasher11年

22

安装网络时间协议

make在服务器上的Samba SMB CIFS共享上运行时,这也发生在我身上。一种持久的解决方案ntp是在服务器和客户端上都安装守护程序。(请注意,通过运行无法解决此问题ntpdate。这只会暂时解决时差问题,而将来不会解决。)

对于Ubuntu和Debian衍生的系统,只需在命令行中输入以下行:

$ sudo apt install ntp

而且,仍然需要touch *在受影响的目录中一次(并且仅一次)发出命令,以一劳永逸地更正文件修改时间。

$ touch *

有关ntp和之间差异的更多信息ntpdate,请参阅:



6

根据LinuxQuestions.org上的用户m9dhatter

“ make”使用文件的时间戳来确定它尝试编译的文件是旧的还是新的。如果您的时钟转弯,则可能无法编译。

如果您尝试在另一台计算机上修改文件,并提前几分钟将其传输到您的计算机上,然后尝试对其进行编译,则可能会发出警告,指出该文件已被修改。时钟可能会偏斜或达到某种效果(无法真正记住)。您可以将ls放入有问题的文件并执行以下操作:

#touch <违规文件的文件名>


6

这里的其他答案很好地解释了这个问题,因此在此我不再赘述。但是有一种解决方案可以解决,但尚未列出:只需运行make clean,然后重新运行即可make

使make删除所有已编译的文件将防止make拥有任何文件来比较其时间戳,从而解决警告。


这不是一个真正的解决方案:如果编译器需要30分钟来编译所有内容,而我正在处理一个文件(其中构建仅需要2秒),那么我将全天浪费在对文件的单个部分进行修改庞大的图书馆。对?但是,是的,与make clean您一起解决问题(通过创建其他问题)。
Leos313 '19

@ Leos313我只是分享对我有用的东西。我在没有root权限的学校网络中遇到了它,因此无法设置NTP,并且我不信任仅touch在所有文件上使用的编译结果。没错,它需要完全重新编译,但是是否值得花时间取决于您的优先级和项目规模。我认为仅仅因为它不是最佳解决方案或存在某些缺点而说“不是一个真正的解决方案”是不正确的。它可以解决问题;听起来像是我的解决方案。
skrrgwasme,

我没有投票:)它通过创建其他人来解决问题。仅此而已!:)当然,答案会在大多数情况下有所帮助,值得在这里!我想强调的是,有时保持警告比发出警告要好make clean
Leos313 '19

4

我过去曾经遇到过-由于计算机上的时钟已耗尽。考虑设置NTP,以便所有计算机都具有相同的时间。


2

这通常是由于主机和客户端计算机之间的时间不匹配所致。您可以尝试使用ntp同步计算机上的时间。


1

解决方案是运行NTP客户端,只需运行以下命令

#ntpdate 172.16.12.100

172.16.12.100是ntp服务器


2
欢迎使用Stack Overflow!谢谢你的帖子!请不要在帖子中使用签名/标语。您的用户名将被视为您的签名,并且您可以使用个人资料发布自己喜欢的任何信息。签名/标语常见问题解答
Andrew Barber

使用ntpdate仅仅是一次校正。最好ntp同时在服务器和客户端上安装以获得持久的解决方案。
Serge Stroobandt 2014年

1

更换计算机中的手表电池。当需要更换主板上看似硬币的电池时,我已经看到此错误消息。


1

(以防万一有人登陆这里)如果您具有sudo权限,一种选择是同步系统时间

sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"

-1

检查编译结果(例如somefile.o)是否早于源代码(例如somefile.c)。上面的警告表示有关文件时间戳的信息很奇怪。大学服务器的系统时钟可能与您的时钟不同,例如,您在下午1点推送一个文件,修改日期为下午2点。您可以通过键入日期在控制台上看到时间。


-3

这发生在我身上。这是因为我跑了make -j 4,有些工作失灵了。使用该-j选项时,应该会出现此警告。


5
作业无法正常完成。并不意味着它们的修改时间应该在将来。
klimkin

@klimkin为什么不呢?我认为有些处理器在其他处理器启动之前就完成了组件的构建。
千焦耳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.