前一篇已經大概說明怎麼把一個 Visual Studio 專案的第三方函式庫管理、改成用 vcpkg 的 Manifest 模式來進行管理了。而這一篇,則是來講一下在 Ubuntu 24.04 下,要使用 Makefile 與 g++ 來建置的話,要怎麼修改。
不過這邊也要先聲明一下,Heresy 和 Makefile 沒有很熟,所以也是隨便寫到能動而已,有可能會有更好的寫法。
vcpkg 的安裝與設定
這邊是使用 Docker 環境還來測試 vcpkg 的安裝與設定,使用的基礎映像檔是 ubuntu:24.04,安裝的指令大致上如下:
apt update && apt upgrade -y apt install -y --no-install-recommends \ build-essential \ git ca-certificates \ curl zip unzip tar \ pkg-config
這邊算是比較簡單的安裝方法,其中:
- 開發用的工具這邊是很簡單地用「build-essential」,如果需要其他工具、像是更新的 g++ 14 的話,就需要自己另外安裝、設定
- git 和 ca-certificates 則是 clone https 時需要的
- curl 等工具,是執行 vcpkg 安裝的腳本需要的
- pkg-config 這邊則是要透過 vcpkg 安裝 libarchive 時需要的
之後,就可以開始下載 vcpkg 了(官方文件)。
下面的指令,是可以把 vcpkg 安裝在「/vcpkg/」下的指令;如果需要安裝到其他路徑,也可以自行修改路徑。
git clone https://github.com/microsoft/vcpkg.git /vcpkg cd /vcpkg ./bootstrap-vcpkg.sh
之後則是要設定環境變數,讓系統知道 vcpkg 在哪裡。如果是一次性的設定,指令是:
export VCPKG_ROOT=/vcpkg export PATH=$VCPKG_ROOT:$PATH
而如果是實體機器希望以後都可以固定使用,就需要根據自己使用的 shell、修改設定檔了。例如 bash 的就是要修改「~/.bashrc」這個檔案。
使用 vcpkg
這邊基本上是使用上一篇文章、已經設定好的專案(連結),這邊可以直接以下面的指令來取得「vcpkg」這個分支:
git clone https://gitlab.com/kheresy/vcpkg-example.git --branch vcpkg
之後只要執行下面的指令、就可以完成建置了。
cd vcpkg-example vcpkg install make
這邊由於沒有把 vcpkg 的指令寫進 Makefile,所以要先在外層手動執行「vcpkg install」;如果想要的話,也可以把它寫進 Makefile。
最外層的 Makefile 裡面,會透過下面的指令、設定 VCPKG_INSTALL 路徑:
VCPKG_INSTALL := $(CURDIR)/vcpkg_installed/x64-linux
然後在建置 archive-info 的時候,則是會把這個變數傳進去。
而 archive-info 的 Makefile 的內容則如下:
.SUFFIXES: .SUFFIXES: .cpp .o archive-info : archive-info.o g++ -o $@ $^ -L$(VCPKG_INSTALL)/lib -larchive -lbz2 -lzstd -llzma -lz -llz4 -lssl -lcrypto .cpp.o: g++ --std=c++20 -I$(VCPKG_INSTALL)/include -c $< clean: rm -f archive-info *.o
因為使用 Makefile 時不像 Visual Studio 有整合、會自動設定對應的路徑,所以這邊需要在 Makefile 裡面加上對應的 vcpkg 的路徑。
另外,由於使用 vcpkg 安裝和使用 apt 安裝的時候,編譯參數可能會不一樣,所以實際上在使用設定上可能會有些不同。
像是以這個例子來說,如果是使用 apt 安裝的 libarchive-dev 的話,要連結的函式庫應該只要加上「-larchive」就可以了;但是在使用 vcpkg 的時候,則是要把所有需要的函式庫都連結進來,這應該是因為 vcpkg 預設會用靜態函式庫來編譯的關係。
這邊個人覺得比較麻煩的,是 vcpkg 好像沒有指令可以快速地知道目前安裝的路徑?如果用到環境不同、導致使用的 triplet 不同的話,路徑就也需要修改了。
像這邊 Heresy 是寫死成 x64-linux,但是拿到 ARM 或者 x86 的機器上,應該就會因為判斷成不同的 triplet、導致安裝路徑不同而無法編譯了。這部分有沒有比較好的方法?不知道。
這篇大概就是這樣了。
以這種相對簡單的專案來說,要透過 vcpkg 來同時維護 Windows 和 Linux 開發環境的套件,其實算是滿簡單的。比較大的問題,應該還是會在於 vcpkg 預設的建置參數設定可能會和系統不一樣、所以本來的 Makefile、或是其他建置系統的參數可能都會因此需要調整。
另外,某些套件在透過 vcpkg 安裝的時候,可能也會需要使用系統的套件;像是這邊要安裝 libarchive 時,其實就需要透過 apt 安裝 pkg-config 才行。
本系列文章目錄:
- 簡介
- 搭配 Visual Studio 使用 vcpkg
- 在 Makefile 與 g++ 環境使用 vcpkg
- vcpkg 套件的功能與版本設定(manifest 模式)
- 自行擴展 vcpkg 的套件:以 zlib-ng 取代 zlib
