在 Makefile 與 g++ 環境使用 vcpkg

| | 0 Comments| 10:05|
Categories:

前一篇已經大概說明怎麼把一個 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-infoMakefile 的內容則如下:

.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

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *