昨天我們用 Visual Studio 搭配 Conan 套件管理器,成功導入兩套第三方函式庫:fmt + nolhmann JSON。
今天我們要來接上第二個建置系統:Xcode。
這篇的實測環境:
用 Xcode 建一個 macOS > Command Line Tool 專案,語言選 C++。

接著往專案根目錄添加一個名為 conanfile.txt 的文字檔案,作為 Conan 的設定入口。
目錄結構如下:
hello-conan-xcode/
├── conanfile.txt
├── hello-conan-xcode.xcodeproj
└── hello-conan-xcode/
└── main.cpp
開啟 conanfile.txt,填入以下內容。
[requires]
fmt/12.2.0
nlohmann_json/3.12.0
[generators]
XcodeDeps
XcodeToolchain
[requires] 區塊,寫我們想要導入的函式庫+版本號碼,中間用斜線隔開,一個函式庫一行。(跟前兩篇完全一樣)
此範例用了大家耳熟能詳的 fmt 以及 nlohmann JSON 函式庫。
[generators] 區塊則是填入 XcodeDeps + XcodeToolchain,告訴 Conan 我們想要對接 Xcode,請你產生 Xcode 設定檔案 (xcconfig)。
開啟終端機(Terminal)並切換到專案的根目錄,執行以下指令:
conan install . --build=missing -of conan -s build_type=Release
conan install . --build=missing -of conan -s build_type=Debug
conan install 就是安裝套件的指令。
--build=missing 是告訴 Conan 萬一沒辦法從伺服器上找到預編譯好的二進位檔,就抓原始碼下來現場編譯。-of=conan -of 是 output-folder 的縮寫,指示 Conan 把產生的 Xcode 設定檔案放進 conan 子目錄下。
因為 Xcode 專案通常有兩種組態(Debug/Release),所以我們需要執行安裝指令兩次,分別安裝Debug/Release兩種版本的二進位檔。
跑完之後 conan/ 底下會多出一堆 .xcconfig,這樣就表示安裝成功了:
conan/
├── conan_config.xcconfig
├── conandeps.xcconfig
├── conan_fmt.xcconfig
├── conan_fmt__fmt_release_arm64.xcconfig
├── ...
├── conantoolchain_release_arm64.xcconfig
└── conantoolchain.xcconfig
這麼多檔案裡面,我們只需關注一個檔案:conan_config.xcconfig。
現在來到關鍵一步了,匯入 xcconfig 設定檔!
一、把 conan/conan_config.xcconfig 拖進 Xcode 的專案導覽列
這裡要特別小心!!要拖放到藍色專案圖示那一行上再放開,不能只拖到左欄上的隨便地方。

然後選擇:Reference files in place。(如果做錯這步,Xcode會把檔案複製一份到專案目錄下,而不是引用 conan 子目錄下的檔案,整個目錄結構就亂了)

點選 PROJECT(不是 Target)> Info > Configurations
展開 Debug 和 Release,專案層級的設定檔選成 conan_config.xcconfig

這樣子就成功把 Conan 套件和 Xcode 連結起來囉!
現在 main.cpp 裡面已經可以直接使用 fmt 以及 nlohmann JSON 函式庫了。
這是 main.cpp 的原始碼:
#include <fmt/base.h>
#include <nlohmann/json.hpp>
int main() {
nlohmann::json j = {
{"name", "Conan"},
{"language", "Python"},
{"stars", 9000}
};
fmt::print("Hello, {}!\n", j["name"].get<std::string>());
fmt::print("{}\n", j.dump(2));
return 0;
}
從頭到尾都不需要自己設定 Header Search Paths/Library Search Paths。
按下 ⌘R 進行編譯與執行!就會看到以下的訊息成功印出囉。

大功告成。
明天來看建置系統的最後一篇:Makefile。