Windows 下安裝 CGAL 並驗證安裝
安裝過程完全參考官方文檔:https://doc.cgal.org/latest/Manual/windows.html
本次安裝環境:windows 10 1909 - 家庭中文版
、VS2017 Community
安裝方式:選用文檔中的第一種,Installing CGAL with the Vcpkg Library Manager
1. 安裝 Vcpkg
github 地址:https://github.com/microsoft/vcpkg
正常(理想)的安裝過程:
C:\dev> git clone https://github.com/microsoft/vcpkg
C:\dev> cd vcpkg
C:\dev\vcpkg> .\bootstrap-vcpkg.bat
遇到如下問題:https://github.com/microsoft/vcpkg/issues/3825
Could not find Visual Studio. VS2015 or VS2017 (with C ...
解決方法:換用 cmd 運行,不使用 Power Shell 運行,可能是 Power Shell 配置有些問題。
2. 使用 Vcpkg 安裝 CGAL
2.1 正常(理想)的安裝過程
C:\dev\vcpkg> ./vcpkg.exe install cgal
2.2 遇到的問題及解決方法
使用 vcpkg 會逐個安裝依賴,可能需要下載很多應用,出現很多問題。除去網絡的問題,一整套流程下來,download、build 仍然需要比較久的時間,需要耐心等待。
問題1:下載依賴的應用太慢
Downloading xxx... // 然后就一直不動了
每次下載不動的時候,可以手動下載,然后放到它需要的目錄下(xx/vcpkg/downloads/)
解決方法參考 - https://blog.csdn.net/qq_39690181/article/details/82910610
問題2:錯誤提醒,vs 缺少英語 pack
Warning: The following VS instances are excluded because the English language pack.
使用 Visual Studio Installer -> 修改 -> 語言包 -> 英語,勾選后安裝即可。
解決方法參考 - https://blog.csdn.net/sdsabc2000/article/details/80049622
問題3:boost license 文件下載不了
Downloading https://raw.githubusercontent.com/boostorg/boost/boost-1.72.0/LICENSE_1_0.txt... Failed. Status: 6;"Could
n't resolve host name
手動是可以打開下載該文件的,只是下載后不知道放在哪里,所以這個問題和問題1不太一樣。
相關的 github issue:https://github.com/microsoft/vcpkg/issues/11005
解決方法:過一會兒再下載,可能是網絡狀況問題。我在換用校園網后下載成功了。這類問題在安裝過程中一直出現,多執行幾次命令,或者換一個網絡環境再試一試。
總結:大部分是網絡問題,能手動下載的可以手動下載,否則可以換個網絡環境,多執行幾次腳本。
最后安裝成功的截圖:(總共花費了差不多 30 min)
3. 編譯例子驗證 CGAL 安裝
3.1 添加 CGAL 到項目包含目錄
在 VS 中新建 Visual C++ 空項目,在解決方案資源管理器中,右鍵項目屬性,打開屬性頁:
- 配置屬性 -> VC++ 目錄 -> 包含目錄 -> 編輯,
- 添加上剛剛安裝的 CGAL 目錄:
YOUR_INSTALL_DIR\vcpkg\installed\x86-windows\include
,如下圖
要注意,屬性頁的配置和平台選項(屬性頁最上方)需要和工具欄中的一致,圖中均為:Debug - x64
。
3.2 編寫程序並運行
這里的代碼使用參考官方文檔中的 Hellow World
:https://doc.cgal.org/latest/Manual/tutorial_hello_world.html
項目中添加新建項,粘貼下列代碼:
#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
int main()
{
Point_2 p(1,1), q(10,10);
std::cout << "p = " << p << std::endl;
std::cout << "q = " << q.x() << " " << q.y() << std::endl;
std::cout << "sqdist(p,q) = " << CGAL::squared_distance(p,q) << std::endl;
Segment_2 s(p,q);
Point_2 m(5, 9);
std::cout << "m = " << m << std::endl;
std::cout << "sqdist(Segment_2(p,q), m) = "
<< CGAL::squared_distance(s,m) << std::endl;
std::cout << "p, q, and m ";
switch (CGAL::orientation(p,q,m)){
case CGAL::COLLINEAR:
std::cout << "are collinear\n";
break;
case CGAL::LEFT_TURN:
std::cout << "make a left turn\n";
break;
case CGAL::RIGHT_TURN:
std::cout << "make a right turn\n";
break;
}
std::cout << " midpoint(p,q) = " << CGAL::midpoint(p,q) << std::endl;
return 0;
}
3.3 查看運行結果
編譯運行,可以得到如下輸出:
這時 CGAL 應該是安裝成功了。
4. 為 CGAL 添加可選的第三方依賴 - 安裝 Eigen 庫
這里主要以安裝 Eigen 為例。當使用 CGAL 運行例子時,大部分可以正常運行,而有些需要額外庫的支持,如,在 Point Set Processing Package 中,運行法向估計例子時,產生以下錯誤:
error C4996: 'CGAL::Diagonalize_traits<FT,3>::diagonalize_selfadjoint_covariance_matrix': CGAL::Diagonalize_traits is a deprecated class that can lead to precision issues, please use CGAL::Eigen_diagonalize_traits
是說 CGAL::Diagonalize_traits
已經棄用,需要使用 CGAL::Eigen_diagonalize_traits
來代替。查閱資料,並且分析庫文件得知,安裝 Eigen 庫后,可以解決這個問題。
4.1 使用 Vcpkg庫安裝 Eigen
.\vcpkg.exe install eigen3
使用 Vcpkg 可以很容易安裝 Eigen,之后在使用 VS2017 編譯時,由於 Eigen 已經存在,編譯時會使用 CGAL::Eigen_diagonalize_traits
,上述問題解決。
然而會出現新的問題:
main.obj : error LNK2019: 無法解析的外部符號 __gmpq_clear,該符號在函數 "public: __cdecl CGAL::Gmpq_rep::~Gmpq_rep(void)" (??1Gmpq_rep@CGAL@@QEAA@XZ) 中被引用
main.obj : error LNK2019: 無法解析的外部符號 __gmpq_equal,該符號在函數 "public: bool __cdecl CGAL::Gmpq::operator==(class CGAL::Gmpq const &)const " (??8Gmpq@CGAL@@QEBA_NAEBV01@@Z) 中被引用
main.obj : error LNK2019: 無法解析的外部符號 __gmpq_init,該符號在函數 "public: __cdecl CGAL::Gmpq_rep::Gmpq_rep(void)" (??0Gmpq_rep@CGAL@@QEAA@XZ) 中被引用main.obj : error LNK2019: 無法解析的外部符號 __gmpq_set_d,該符號在函數 "public: __cdecl CGAL::Gmpq::Gmpq(double)" (??0Gmpq@CGAL@@QEAA@N@Z) 中被引用
C:\Users\15651\source\repos\CGAL-test\x64\Debug\CGAL-test.exe : fatal error LNK1120: 4 個無法解析的外部命令
通常無法解析的外部符號是由於 lib 缺失引起的,錯誤原因可以看出是 gmplib 缺失,可以從官方網站下載。
無法解析的外部符號參考:
4.2 下載缺失的 gmplib
找到缺失的 LIB,GMP,下載下列兩個預編譯的庫文件(官方下載鏈接):
解壓到同一目錄下:
gmplib 缺失參考:
-
https://doc.cgal.org/latest/Manual/thirdparty.html#secessential3rdpartysoftware
-
https://github.com/CGAL/cgal/issues/4154 - github issue
-
https://stackoverflow.com/questions/48354266/cgal-skeletonization-compile-errors
4.3 修改項目屬性
下載完成后,需要將上述庫添加到項目中。
項目 -> 屬性 -> 鏈接器 -> 輸入 -> 附加依賴項,添加上剛剛解壓得到的兩個 lib 文件;然后將兩個 dll 放置在系統目錄下或者編譯出的 exe 同級目錄下。再次嘗試編譯運行,應該可以成功。
如果有以下問題:
-
編譯錯誤:“無法解析的外部符號”;說明項目中 lib 沒有添加成功,檢查下路徑是否正確。
-
運行錯誤:“由於找不到xxx,無法繼續執行代碼”(下圖);說明 dll 位置放錯了,把它放到生成的 exe 的同級目錄下就可以了。
如果在運行某軟件或編譯程序時提示缺少、找不到libgmp-10.dll等類似提示,libgmp-10.dll 拷貝到指定目錄即可(一般是system系統目錄或放到軟件同級目錄里面),或者重新添加文件引用。
References
- CGAL 5.0.2 - Manual Documentation https://doc.cgal.org/latest/Manual/index.html
- Vcpkg Github Page https://github.com/microsoft/vcpkg