使用 Conan 時最常看到的錯誤就是 Missing prebuilt package

咦,ConanCenter 不是都有預編譯好的套件嗎?那為什麼我跑 conan install 指令,還是常常看到大片的紅紅的 Missing prebuilt package ?
說好的「下載就能用」呢?
答案就是: ConanCenter 有 binary,但不一定有「為你量身訂做」的那一份 binary。
我們前面提過,C++二進位檔案之間的相容性錯綜複雜,到底 Visual Studio 2026 編譯出來的檔案,Visual Studio 2019 能不能用呢? GCC 10 跟 GCC 13 的相容性呢? Debug 版跟 Release 版的二進位檔案呢?一個預編譯套件用了 C++20 標準,可是下游的消費端專案只能跑 C++17,這樣可以直接下載套用嗎?
上面那一串,我可以跟你說,有的可以,有的不行。實在太多條件跟狀況了,而 Conan 在很多狀況下都盡可能的把這些不相容的地方考慮進來,所以在真實的專案情境下(例如:我這個專案就是要用 MSVC2026 + /MT + C++26),幾乎無可避免的會恰好碰到一個小地方沒對上,最終就無法下載伺服器上的預編譯二進位檔。
所以你從外面看「這家店明明有賣這道菜呀」,但是實際走進店裡,卻發現店家不做你要的「特製不加香菜大辣版」。
D14 我們講過 Package ID 這個東西:Conan 把套件的 settings、options 和依賴丟進去算 hash,算出來的就是 package ID,每個 package ID 對應一個 binary。
所以下面這些,只要改一項,就是另一個 package ID:
os: Windows vs Linuxarch: x86_64 vs armv8compiler: msvc vs apple-clangcompiler.version: 194 vs 193、17 vs 21compiler.runtime: MSVC 的 /MD(dynamic)vs /MT(static)compiler.cppstd: 14、17、20…build_type: Release vs Debugoptions: shared=True vs False、header_only
只要有一個東西沒對上,抱歉,預編譯二進位檔可能跟你無緣。
除了本機 settings 和 options,還有另一個造成 binary 突然消失的隱形殺手:Recipe 改版(recipe revision)。
套件版本號雖然沒變(都是 fmt/12.2.0),但維護者只要更新了套件的打包腳本,就會產生新的 recipe revision。此時本機快取中保存的二進位檔,已經對不上新的 recipe。導致昨天明明抓得到檔案,今天就可能突然 Missing prebuilt package。這是很多團隊在 CI 上最常踩到的靈異事件之一。