Eigen是一個高效能的C++線性代數庫,廣泛用於科學計算、機器學習、計算機視覺等領域。不過,Eigen有點特別,它是一個純標頭檔案實現的庫;也就是說,任何一個程式要引入它,只要include它的標頭檔案就可以了。這天然就規避了不同作業系統不同編譯器造成的二進位制相容的問題,所有的實現都include原始碼了,那還不是輕鬆跨平臺?
像Eigen這種風格的庫就被稱為Header Only庫。這種庫使用起來確實太方便了,所以現在很多庫都採取了這種設計。我們知道C/C++的宣告和實現是分開的,所以使用起來相當的麻煩,相同的函式簽名總是要寫兩次,然後把實現隱藏起來編譯成靜態庫或者動態庫。這種風格的庫就完全不會有這個問題,include標頭檔案就行。不過這種風格也不是沒有缺點,比如增加了呼叫方的構建時間、構建成果體積增加、符號衝突、不能隱藏實現等,所以採用這種風格的庫一般都是模板庫。
Header Only庫也並不意味著不需要構建,因為構建還是包含很多步驟的,使用CMake進行構建的關鍵指令如下:
# 配置CMake
cmake .. -G "$Generator" -A x64 `
-DCMAKE_BUILD_TYPE=RelWithDebInfo `
-DCMAKE_PREFIX_PATH="$InstallDir" `
-DCMAKE_INSTALL_PREFIX="$InstallDir" `
-DBUILD_TESTING=OFF
# 構建階段,指定構建型別
cmake --build . --config RelWithDebInfo
# 安裝階段,指定構建型別和安裝目標
cmake --build . --config RelWithDebInfo --target install
如果設定不構建測試程式,這個構建過程其實就是複製必須的標頭檔案到安裝目錄。另外,還會生成一些.cmake格式的包配置檔案到安裝目錄,這些檔案是便於其他專案找到和使用這些Eigen的。不止Eigen,大多數CMake構建的庫都會生成類似的包配置檔案,這一點我們放在後續的文章中進行一步論述。