make时的烦人问题modification time in the future

本文介绍了在使用make进行编译过程中遇到的时间不匹配警告及make:Nothing to be done for `all`的问题解决方法。首先通过修改系统时间或运行特定命令解决未来时间文件导致的警告,其次通过make clean并重新配置动态链接库解决无操作问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自:http://blog.sina.com.cn/s/blog_46d528490100kwux.html

感谢作者分享


今天因为处理视频时,发现老的版本不能使用,所以编译一个新的来看看,但怎么样打make 都没有反应。

后来实在没有法子,打了一下make clean,清除一下,然后在重来,发现提示时间不对。在make时就提示

make: Warning: File `config.mak’ hasmodification time 2.7e+04 s in the future
make:warning:  Clock skew detected. Your build may be incomplete

原因:如果上一次编译时为20071001,你把系统时间改成20070901后再编译就会报这样的错误.
解决:把时间改了或运行下来命令再make
find . -type f -exec touch {} \;

 

下面的是我找的参考:

 

检查了半天本机时间,也没有问题,后来才发现,原来那个目录是在nfs上,那个nfs的服务器有问题。所以同步了nfs的文件服务器.解决这个问题。

但没多久出现

make: Nothing to be done for `all’

这个比较容易解决点.

make clean,然后在ldconfig一下,解决.

ldconfig是一个动态链接库管理命令

为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig
ldconfig 

命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令


<think>我们正在处理一个构建问题,其中文件'gac.pro'的修改间被报告为未来间,这可能导致构建工具(如make)认为该文件比其依赖项更新,从而跳过必要的构建步骤。 原因分析: 1. 系统间不正确:可能是系统间被错误设置到了未来间,然后修改了文件,之后系统间又调整回正确间。 2. 文件系统间戳问题:可能是文件系统错误或跨区文件共享导致的间戳不一致。 3. 文件被从另一个间超前的系统复制过来。 解决方案: 1. 检查系统间:确保当前系统间正确,可以使用`date`命令(Linux)或查看系统间设置(Windows)。 2. 修复文件间戳:将文件的修改间设置为当前间。 具体操作(Linux环境下): 使用`touch`命令来更新文件的间戳为当前间: touch gac.pro 如果这个文件很多,可以递归地修复整个目录(谨慎使用): find . -type f -exec touch {} \; 在Windows环境下,可以通过文件属性修改间,或者使用PowerShell命令: (Get-Item "gac.pro").LastWriteTime = Get-Date 3. 如果问题是由于文件系统挂载选项(如noatime)或网络文件系统(NFS)引起,检查挂载选项,确保间同步。 4. 防止未来再次发生:确保系统间同步,使用NTP服务同步间。 参考引用:关于NTP服务,它可以帮助系统间保持准确,并且NTP守护进程会记录间漂移并在启动恢复[^1]。 如果问题仍然存在,考虑检查构建工具是否有相关选项可以忽略间戳检查(不推荐,因为可能掩盖真正的问题)。 现在,我们针对用户的问题,给出具体的解决步骤: 步骤1:确认问题文件 步骤2:使用touch命令修复该文件的间戳 步骤3:重新运行构建 示例命令: $ touch gac.pro $ make # 或者你的构建命令 如果构建成功,则问题解决。 如果问题涉及多个文件,可以使用find命令批量修复。 注意:在修复之前,确保没有其他进程正在写入这些文件,以免导致数据不一致。 相关问题: 1. 如何防止文件间戳变成未来间? 2. 除了touch命令,还有哪些方法可以修改文件的间戳? 3. 如何配置NTP服务来同步系统间?</think>### 文件修改间异常(未来间)的解决方案 当构建系统提示 `file 'gac.pro' has modification time in the future` 错误,表明该文件的最后修改间被记录为未来间。这通常由以下原因导致: #### 根本原因分析 1. **系统间不同步** - 文件创建/修改系统钟超前(如 BIOS 电池故障或手动误设间) - 当前已修正间,但文件间戳未更新 2. **跨区文件传输** - 文件从区超前或钟超前的系统复制而来 - 容器/VirtualBox 等虚拟环境钟漂移 3. **文件系统错误** - 文件系统损坏导致元数据异常 - 网络文件系统(NFS/Samba)间同步问题 --- ### 修复步骤 #### 方法 1:重置文件间戳(推荐) ```bash # Linux/macOS 终端 touch -c gac.pro # 将修改间设为当前系统间 # Windows PowerShell (Get-Item "gac.pro").LastWriteTime = Get-Date ``` #### 方法 2:批量修复目录 ```bash # 修复整个项目目录的间戳 find . -type f -exec touch -c {} \; ``` #### 方法 3:强制构建工具忽略间检查 ```bash # Makefile 场景添加参数 make -B # -B 强制重建所有目标 # CMake 场景 cmake --build . --clean-first ``` #### 方法 4:系统级修复 1. **同步硬件钟**: ```bash sudo hwclock --systohc # 同步系统与硬件钟 sudo ntpdate pool.ntp.org # 强制 NTP 同步 ``` 2. **启用 NTP 守护进程**(防止复发): ```bash sudo timedatectl set-ntp on # systemd 系统 sudo service ntp restart # 传统 init 系统 ``` > NTP 服务会持续校准钟漂移并记录修正值[^1] --- ### 预防措施 1. 在虚拟机/容器中: ```bash # VirtualBox 启用间同步 VBoxManage guestproperty set <VM> "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold" 1000 ``` 2. 在构建脚本开头添加间校验: ```bash # 检查未来间文件 if find . -newermt "now" | grep -q .; then echo "发现未来间戳文件" >&2 exit 1 fi ``` --- ### 技术原理 文件系统记录的间戳基于 **UTC 间**,与区设置无关。构建工具(如 Make)通过对比依赖文件的修改间决定是否需要重建: ```mermaid graph LR A[源文件] --> B[目标文件] B -->|修改间早于源文件| C[触发重建] D[未来间文件] -->|间逻辑错误| E[构建中断] ``` > 当检测到未来间戳,构建工具会拒绝操作以避免潜在的数据不一致问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值