iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
Software Development

C++ 套件管理器求生指南 Conan vs Vcpkg系列 第 27 篇

D27:Conan 最常見錯誤 Missing prebuilt package 談 Package ID 與相容性

  • 分享至 

  • xImage
  •  

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

咦,ConanCenter 不是都有預編譯好的套件嗎?那為什麼我跑 conan install 指令,還是常常看到大片的紅紅的 Missing prebuilt package ?

說好的「下載就能用」呢?

答案就是: ConanCenter 有 binary,但不一定有「為你量身訂做」的那一份 binary。

一、案發現場:Missing prebuilt package 為什麼?

我們前面提過,C++二進位檔案之間的相容性錯綜複雜,到底 Visual Studio 2026 編譯出來的檔案,Visual Studio 2019 能不能用呢? GCC 10 跟 GCC 13 的相容性呢? Debug 版跟 Release 版的二進位檔案呢?一個預編譯套件用了 C++20 標準,可是下游的消費端專案只能跑 C++17,這樣可以直接下載套用嗎?

上面那一串,我可以跟你說,有的可以,有的不行。實在太多條件跟狀況了,而 Conan 在很多狀況下都盡可能的把這些不相容的地方考慮進來,所以在真實的專案情境下(例如:我這個專案就是要用 MSVC2026 + /MT + C++26),幾乎無可避免的會恰好碰到一個小地方沒對上,最終就無法下載伺服器上的預編譯二進位檔。

所以你從外面看「這家店明明有賣這道菜呀」,但是實際走進店裡,卻發現店家不做你要的「特製不加香菜大辣版」。

二、哪些東西讓 binary missing?來聊聊 Package ID

D14 我們講過 Package ID 這個東西:Conan 把套件的 settings、options 和依賴丟進去算 hash,算出來的就是 package ID,每個 package ID 對應一個 binary。

所以下面這些,只要改一項,就是另一個 package ID:

  • os: Windows vs Linux
  • arch: x86_64 vs armv8
  • compiler: msvc vs apple-clang
  • compiler.version: 194 vs 193、17 vs 21
  • compiler.runtime: MSVC 的 /MD(dynamic)vs /MT(static)
  • compiler.cppstd: 14、17、20…
  • build_type: Release vs Debug
  • options: shared=True vs False、header_only

只要有一個東西沒對上,抱歉,預編譯二進位檔可能跟你無緣。

除了本機 settings 和 options,還有另一個造成 binary 突然消失的隱形殺手:Recipe 改版(recipe revision)。

套件版本號雖然沒變(都是 fmt/12.2.0),但維護者只要更新了套件的打包腳本,就會產生新的 recipe revision。此時本機快取中保存的二進位檔,已經對不上新的 recipe。導致昨天明明抓得到檔案,今天就可能突然 Missing prebuilt package。這是很多團隊在 CI 上最常踩到的靈異事件之一。


上一篇
D26:vcpkg DLL動態庫部署
系列文
C++ 套件管理器求生指南 Conan vs Vcpkg 共 27 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言