Windows 下安裝 CGAL 並驗證安裝


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... // 然后就一直不動了

1588501410461

每次下載不動的時候,可以手動下載,然后放到它需要的目錄下(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

1588502492112

手動是可以打開下載該文件的,只是下載后不知道放在哪里,所以這個問題和問題1不太一樣。

相關的 github issue:https://github.com/microsoft/vcpkg/issues/11005

解決方法:過一會兒再下載,可能是網絡狀況問題。我在換用校園網后下載成功了。這類問題在安裝過程中一直出現,多執行幾次命令,或者換一個網絡環境再試一試。

總結:大部分是網絡問題,能手動下載的可以手動下載,否則可以換個網絡環境,多執行幾次腳本。

最后安裝成功的截圖:(總共花費了差不多 30 min)

1588510949256

3. 編譯例子驗證 CGAL 安裝

3.1 添加 CGAL 到項目包含目錄

在 VS 中新建 Visual C++ 空項目,在解決方案資源管理器中,右鍵項目屬性,打開屬性頁:

  1. 配置屬性 -> VC++ 目錄 -> 包含目錄 -> 編輯,
  2. 添加上剛剛安裝的 CGAL 目錄:YOUR_INSTALL_DIR\vcpkg\installed\x86-windows\include,如下圖

1588505907647

要注意,屬性頁的配置和平台選項(屬性頁最上方)需要和工具欄中的一致,圖中均為:Debug - x64

3.2 編寫程序並運行

這里的代碼使用參考官方文檔中的 Hellow Worldhttps://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 查看運行結果

編譯運行,可以得到如下輸出:

image-20200504131209715

這時 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

image-20200512173829933

使用 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

image-20200512172958495

找到缺失的 LIB,GMP,下載下列兩個預編譯的庫文件(官方下載鏈接):

解壓到同一目錄下:

image-20200512181151902

gmplib 缺失參考:

4.3 修改項目屬性

下載完成后,需要將上述庫添加到項目中。

項目 -> 屬性 -> 鏈接器 -> 輸入 -> 附加依賴項,添加上剛剛解壓得到的兩個 lib 文件;然后將兩個 dll 放置在系統目錄下或者編譯出的 exe 同級目錄下。再次嘗試編譯運行,應該可以成功。

如果有以下問題:

  1. 編譯錯誤:“無法解析的外部符號”;說明項目中 lib 沒有添加成功,檢查下路徑是否正確。

  2. 運行錯誤:“由於找不到xxx,無法繼續執行代碼”(下圖);說明 dll 位置放錯了,把它放到生成的 exe 的同級目錄下就可以了。

image-20200512192713705

如果在運行某軟件或編譯程序時提示缺少、找不到libgmp-10.dll等類似提示,libgmp-10.dll 拷貝到指定目錄即可(一般是system系統目錄或放到軟件同級目錄里面),或者重新添加文件引用。

References


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM