diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index 086edba..6f08132 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -302,20 +302,6 @@ class Phase2Translator: sha1 = fname[:-8] self.stub_files[sha1] = fpath - # 从全局缓存补充 temp_dir 中缺失的 .vpi / .stub.ll - if os.path.isdir(_GLOBAL_CACHE_DIR): - for fname in os.listdir(_GLOBAL_CACHE_DIR): - if fname.startswith('_'): - continue - if fname.endswith('.vpi') or fname.endswith('.pyi'): - sha1 = fname[:-4] - if sha1 not in self.sig_files: - self.sig_files[sha1] = os.path.join(_GLOBAL_CACHE_DIR, fname) - elif fname.endswith('.stub.ll'): - sha1 = fname[:-8] - if sha1 not in self.stub_files: - self.stub_files[sha1] = os.path.join(_GLOBAL_CACHE_DIR, fname) - # 从内存存储器读取 SHA1 映射(_sha1_map.txt 仅人类可读,不再作为机器数据源) # 延迟导入避免循环依赖(Config 导入 Phase2Translator) from lib.Projectrans.Config import get_sha1_map_store @@ -331,6 +317,25 @@ class Phase2Translator: for sha1, stub_path in self.stub_files.items(): self.sha1_map[sha1] = sha1 + # 从全局缓存补充 temp_dir 中缺失的 .vpi / .stub.ll。 + # 只补充"当前编译有效"的 sha1(在 sha1_map 中):.transpyc_cache 会残留 + # 旧版源码的缓存(如旧 __builder.vp 的 9026a429f5e2d0e0.pyi/.stub.ll 与新 + # d9b3d06934cd1898 共存),不加过滤会把旧版 .vpi/.stub.ll 也加载进 + # sig_files/stub_files → 同名类(IRBuilder)按旧 sha1 前缀注册 → + # ld.lld undefined symbol: 9026a429f5e2d0e0.new_builder。 + if os.path.isdir(_GLOBAL_CACHE_DIR): + for fname in os.listdir(_GLOBAL_CACHE_DIR): + if fname.startswith('_'): + continue + if fname.endswith('.vpi') or fname.endswith('.pyi'): + sha1 = fname[:-4] + if sha1 in self.sha1_map and sha1 not in self.sig_files: + self.sig_files[sha1] = os.path.join(_GLOBAL_CACHE_DIR, fname) + elif fname.endswith('.stub.ll'): + sha1 = fname[:-8] + if sha1 in self.sha1_map and sha1 not in self.stub_files: + self.stub_files[sha1] = os.path.join(_GLOBAL_CACHE_DIR, fname) + def _build_struct_sha1_map(self) -> dict[str, str]: struct_sha1_map = {} valid_sha1_keys = set(self.sha1_map.keys())