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

DMA*_*361 161 linux makefile

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

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

make:warning:检测到时钟偏斜.您的构建可能不完整.

生成的二进制文件正常工作,并且在构建过程中似乎没有任何其他意外错误.

我似乎能够在上传一些新的/替换文件之后通过构建来触发错误(我在本地编辑所有内容然后上传新版本),所以我想知道它是否像文件修改时间不匹配一样简单?还是更关心的事情?

那么,我应该担心吗?我该如何修复/防止这种情况?

Tyl*_*nry 197

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

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

  • @ DMA57361:`touch*`将mtimes更新为当前时间.或者,您可以在桌面上启用NTP来同步您的时钟(假设您的桌面是错误的,而不是Uni的机器......如果是后者,可能会要求系统管理员修复它?) (10认同)
  • @AaronS对于像`touch`这样可以接受多个文件来执行操作的命令,你可以通过`find更高效地执行它(更多).-exec touch {} +`将使用尽可能多的参数调用`touch`. (7认同)
  • 看来群集在我的桌面后面有大约3分钟*的时间,所以在"未来"中修改过的文件似乎是可能的原因.最安全的赌注是在运行构建之前上传任何内容后等待5分钟左右?我宁愿不必等待,那么有没有办法重置任何上传的"未来"文件的时间以避免这个问题? (2认同)
  • 谢谢你,"触摸*"它现在是,我会看看我是否可以找出哪个是错的,并且可能在下次我在网站上与管理员有一个字. (2认同)
  • 在我的情况下,我需要递归触摸:`find 。-exec touch {} \;` (2认同)

jan*_*neb 55

通常,这会在NFS安装目录中构建时发生,并且客户端和NFS服务器上的时钟不同步.

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


Ser*_*ndt 20

安装网络时间协议

make在服务器上运行Samba SMB CIFS共享时,这也发生在我身上.持久的解决方案包括在ntp服务器和客户端上安装守护程序.(请注意,这个问题并没有通过运行ntpdate来解决.这只会暂时解决时间差异,但将来不会解决.)

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

$ sudo apt-get install ntp
Run Code Online (Sandbox Code Playgroud)

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

$ touch *
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢它帮助我在 Windows 下使用 WSL2。 (2认同)

Kha*_*han 8

在终端中输入,它将解决问题:

find . -type f | xargs -n 5 touch

make clean

clean
Run Code Online (Sandbox Code Playgroud)


z *_* - 6

根据LinuxQuestions.org上的用户m9dhatter:

"make"使用文件的时间戳来确定它尝试编译的文件是旧的还是新的.如果你的时钟被刻录,它可能会有问题编译.

如果你尝试在时钟前几分钟修改另一台机器上的文件并将它们传输到你的机器然后尝试编译它可能会发出一个警告,说明该文件是从未来修改过来的.时钟可能会扭曲或有什么影响(不能忘记).你可能只是对违规文件这样做:

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


skr*_*sme 6

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

删除任何已经编译的文件将阻止make有任何文件来比较解决警告的时间戳.