SCons重复重建目标文件但依赖未变更,此情况是否为Bug?
问题原因
你遇到的问题源于SCons在variant_dir下处理共享库时的行为:SharedLibrary默认会生成版本化库文件(如libxyz.so.1.0.0)和指向它的软链接libxyz.so。在你使用的3.1.2版本中,SCons每次运行都会重新创建这个软链接——即使它已经指向正确的目标,这会导致软链接的修改时间(mtime)更新。SCons检测到这个变化后,就会触发依赖它的my_target重建,尽管实际的库文件并未改动。
解决方法
修改依赖关系,让my_target依赖实际的版本化库文件而非软链接:
from SCons.Defaults import Copy as SConsCopy mylib = env.SharedLibrary(target=baselib_name, source=env.Glob("*.cpp"), CXXFLAGS=cxxflags, LINKFLAGS=linkflags) # SharedLibrary返回的列表中,第二个元素是实际的版本化库文件 actual_lib = mylib[1] if len(mylib) > 1 else mylib my_target = env.Command('/path/to/foo', '/path/to/foo.py', SConsCopy("$TARGET", "$SOURCE")) env.Depends(my_target, actual_lib)
另一个可选方案是升级SCons到较新版本,后续版本优化了软链接处理逻辑,不会在目标未变化时重新创建软链接,从而避免不必要的重建触发。
验证方法
可以通过以下命令查看详细的依赖变化原因,确认是软链接的mtime更新导致的问题:
scons -Q --debug=explain
内容的提问来源于stack exchange,提问作者Evgen
相关产品推荐
相关产品推荐

