【配置文檔】配置使用CGAL庫的經驗分享

諸多經驗貼都建議參考CGAL官方網站的步驟一步一步配置,因爲我懶得看英文所以找的都是中文博客和問答,結果走了不少彎路,這裏開一篇經驗貼,記錄錯誤也方便以後的查閱。本文是基於VS2017的配置和使用。這裏是CGAL的使用手冊

一、需要的工具

  1. boost,因爲CGAL需要使用到boost,所以得提前編譯好,或者下載別人已經編譯好的,這樣比較節省時間,但是我在自己配置boost的時候只編譯了thread,時間也比較快,不過之後還可能要求其他的組件,會在後面提到
  2. Qt5,主要是在運行CGAL例子程序的時候需要,反正我還是選擇安裝了,如果不能在線安裝的話離線包點擊這裏下載
  3. CMake

二、boost的編譯

下載地址
我這下載的是boost_1_68_0.7z,直接解壓即可

編譯boost

(1)建議用管理員權限打開cmd;或開始目錄vs2017裏的“適用於 VS 2017 的 x86_x64 兼容工具命令提示”
(2)用命令進入boost根目錄,或者根目錄下面的booststrap.bat文件直接拖到cmd打開的界面並回車,運行結束後會產生b2.exe和bjam.exe,這裏b2.exe是bjam.exe的新版本;(有的下載的是一個打包好的boost.exe,那麼運行這個exe,在其安裝目錄下可以找到booststrap.bat文件;有的下載下來不是exe,那麼解壓下載的boost應該就能直接看到booststrap.bat文件
(3)運行b2.exe;
(4)編譯完成。

但是按照以上步驟編譯完的庫太大,許多功能用不上,而且編譯時間較長,我們這裏建議下載已經編譯好的庫,或者只編譯我們所需要的內容

編譯技巧

b2 stage --toolset=msvc-14.1 --with-thread --stagedir="D:\mySDK\boost_1_68_0\lib" link=shared runtime-link=shared  threading=multi debug release
b2 stage --toolset=msvc-14.1 --with-thread --stagedir="D:\mySDK\boost_1_68_0\lib" link=static runtime-link=static  threading=multi debug release
  • 這裏命令是b2或者bjam都行,
  • stage和install命令都可以用於安裝,stage的話指定目錄用stagedir,install的話指定目錄用prefix
  • –toolset=XXXX指定目標編譯器需要自己去查,我們這裏是msvc-14.1即VS2017
  • –with-XXX用於創建和安裝指定的庫,–without-XXX不對指定的庫進行創建和安裝,默認創建所有的庫,注意with後面是“-”而不是“=”否則會全部編譯
  • link=static|shared指定創建靜態庫或動態庫
  • runtime-link=static|shared指定創建的庫是靜態鏈接還是動態鏈接到C運行庫(或C++標準庫),這個選項需依據–link的類型,不同的編譯器允許的鏈接策略不一樣,比如在GCC下,在生成動態庫(–link=shared)時,就不允許進行靜態鏈接到C運行庫(或C++標準庫)。
  • threading=single|multi指定創建多線程或單線程的版本庫。
  • debug release版都要

不管靜態庫還是動態庫這裏我都編譯了,謹防之後的的錯誤,結果防不勝防…
重點關注【runtime-link=X】 X的取值是share和static,前者指定生成動態lib,後者則是生成靜態lib。
X = static 時 vs項目屬性 → C/C++ →代碼生成 → 運行庫 【多線程調試(/MTd)】
X = share 時 vs項目屬性 → C/C++ →代碼生成 → 運行庫 【多線程調試 DLL (/MDd)】

然後include根目錄,link你的目標lib目錄,千萬確保正確,運行例子程序

#include<iostream>
#include<boost\thread.hpp>
void trd_fun()
{
	std::cout << "test" << std::endl;
}

int main()
{
	boost::thread td(trd_fun);
	td.join();
	system("pause");
	return 0;
}

之後發現依舊報錯,說缺少datetime的lib,所以再次編譯一遍

b2 stage --toolset=msvc-14.1 --with-date_time --stagedir="D:\mySDK\boost_1_68_0\lib" link=shared runtime-link=shared  threading=multi debug release
b2 stage --toolset=msvc-14.1 --with-date_time --stagedir="D:\mySDK\boost_1_68_0\lib" link=static runtime-link=static  threading=multi debug release

成功解決問題

boost命名規則

Win32平臺
libboost_filesystem-vc80-mt-sgdp-1_40.lib
Linux平臺
libboost_filesystem.so.1.40.0
libboost_filesystem.a
命名規則:
前綴:lib,但在Win32平臺,只有靜態庫有lib前綴
庫名稱:以boost_開頭的庫名稱,例子中爲boost_filesystem
編譯器標識:編譯該庫文件的編譯器名稱和版本,例子爲-vc80
多線程標識:若支持多線程,則使用-mt;否則,不出現多線程標識
ABI標識:標識Boost庫的幾個編譯鏈接選項
s:static,靜態庫標識
gd:debug版標識
p:使用STLpor而不是編譯器自帶的STL
版本號:Boost的版本號,例子爲1_40
擴展名:win32平臺爲.lib,Linux平臺爲.a或.so

三、Qt5的安裝

下載地址
我這下載的是qt-opensource-windows-x86-5.12.0.exe
對於咱們的需求安裝這篇博客不錯,基本上沒遇到什麼問題

四、CMake

下載地址
我這下載的是cmake-3.15.0-rc2-win64-x64.msi
說到CMake真是一把辛酸淚了,編譯通不過有一部分就是他的原因,首先儘量選擇最新的版本,否則它找不到boost。不要管它的提示什麼BOOST_INCLUDE_DIR 沒有設好,你確定自己的環境變量沒有錯而又使用的是最新的boost,那麼很有可能是CMake沒有及時更新,沒有識別出你的版本。也就是在編譯CGAL的時候FindBoost.cmake裏沒有最新boost版本,CMake編譯不了
有方法說在老版本FindBoost.cmake文件裏增加"1.68.0" ,反正我是沒有成功

#這是新版的列表
  # The user has not requested an exact version.  Among known
  # versions, find those that are acceptable to the user request.
  #
  # Note: When adding a new Boost release, also update the dependency
  # information in _Boost_COMPONENT_DEPENDENCIES and
  # _Boost_COMPONENT_HEADERS.  See the instructions at the top of
  # _Boost_COMPONENT_DEPENDENCIES.
  set(_Boost_KNOWN_VERSIONS ${Boost_ADDITIONAL_VERSIONS}
    "1.70.0" "1.70" "1.69.0" "1.69"
    "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65"
    "1.64.0" "1.64" "1.63.0" "1.63" "1.62.0" "1.62" "1.61.0" "1.61" "1.60.0" "1.60"
    "1.59.0" "1.59" "1.58.0" "1.58" "1.57.0" "1.57" "1.56.0" "1.56" "1.55.0" "1.55"
    "1.54.0" "1.54" "1.53.0" "1.53" "1.52.0" "1.52" "1.51.0" "1.51"
    "1.50.0" "1.50" "1.49.0" "1.49" "1.48.0" "1.48" "1.47.0" "1.47" "1.46.1"
    "1.46.0" "1.46" "1.45.0" "1.45" "1.44.0" "1.44" "1.43.0" "1.43" "1.42.0" "1.42"
    "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37"
    "1.36.1" "1.36.0" "1.36" "1.35.1" "1.35.0" "1.35" "1.34.1" "1.34.0"
    "1.34" "1.33.1" "1.33.0" "1.33")

五、CGAL的編譯

下載地址
我這下載的是CGAL-4.13.1-Setup.exe
(1)下載完以後完成安裝,注意環境變量裏有沒有CGAL_DIR,值爲CGAL根目錄
(2)之後,在CMake裏找到CGAL的根目錄,然後設置目標build的目錄,這個不多說
(3)記得在用戶變量下給boost增加環境變量
BOOST_INCLUDEDIR:boost根目錄
BOOST_LIBRARYDIR:自己編譯生成的boost的lib目錄,不是原本的libs目錄!
Path:裏面添加BOOST_LIBRARYDIR的路徑,Qt的路徑
(4)在cmake-gui界面點擊左下角:Configure
(5)在第四步無錯誤的情況下,將下圖的兩個選項WITH_demos和WITH_examples勾選上,這樣可以得到CGAL的例子程序(也可以不選上,在第七部分有講解)然後點擊Generate,完成後在你選擇的輸出路徑下有一個CGAL.sln;
Generate
(6)建議在CGAL.sln選擇好某一個工程爲啓動項目,否則生成幾百個浪費時間。
運行之前,在環境變量裏添加Path:…\CGAL-4.7\auxiliary\gmp\lib

當然以上這是運行編譯生成的例子,如果我們需要自己建一個使用CGAL的工程,建立工程之後是需要配置的:
在使用CGAL的時候,需要設置 屬性->配置屬性->VC++目錄:

可執行目錄:

  • $(QTDIR)\5.5\msvc2013\bin
  • $(CGAL_DIR)\auxiliary\gmp\lib
  • $(CGAL_DIR)\bin(or \build\bin)

include目錄中包含:

  • $(BOOST_INCLUDEDIR)
  • $(CGAL_DIR)\include
  • $(CGAL_DIR)\auxiliary\gmp\include

lib目錄中包含:

  • $(QTDIR)\5.5\msvc2013\lib
  • $(BOOST_LIBRARYDIR)
  • $(CGAL_DIR)\lib
  • $(CGAL_DIR)\auxiliary\gmp\lib

屬性->配置屬性->鏈接器->輸入中附加依賴項:

  • libgmp-10.lib
  • libmpfr-4.lib

忽略項:

  • gmp-vc100-mt-gd.lib
  • mpfr-vc100-mt-gd.lib

即便如此,最後還是會出現“找不到 CGAL-vc140-mt-gd-4.13.1.dll”,“找不到 CGAL_Core-vc140-mt-gd-4.13.1”,沒關係,從$(CGAL_DIR)\build\bin中找出來,扔到你的項目目錄下即可。

(7)看到這裏說明第五步並沒有成功,我就在Generate階段遇到了諸多問題,這裏告訴大家一一解決:

  1. 報錯說missing components:
    serialization iostreams regex 和 bzip2 zlib
    遂繼續安裝這幾個組件
b2 stage --toolset=msvc-14.1 --with-thread --with-serialization --with-iostreams --with-regex  --stagedir="D:\mySDK\boost_1_68_0\lib" link=shared  runtime-link=shared threading=multi debug release
b2 stage --toolset=msvc-14.1 --with-thread --with-serialization --with-iostreams --with-regex  --stagedir="D:\mySDK\boost_1_68_0\lib" link=static  runtime-link=static threading=multi debug release
  1. 但是還是報錯說缺少 bzip2 zlib,因爲這兩個
    我們先下載bzip2,當然官網建議去sourceforge下載;
    然後下載zlib,下載完解壓放好位置就行
    然後再次編譯,方法在這裏,將這兩個庫添加到iostreams裏
b2 stage --with-iostreams -s BZIP2_SOURCE="D:\mySDK\bzip2-1.0.6" -s ZLIB_SOURCE="D:\mySDK\zlib-1.2.11" --stagedir="D:\mySDK\boost_1_68_0\lib"
  1. 報錯又說Could NOT find Eigen3
    我們先下載Eigen3然後添加到cmake的Advanced的目錄裏EIGEN3_INCLUDE_DIR添加Eigen3的目錄就好了Eigen3
    最後sln終於生成成功!

六、例子程序

官網的教程很詳細了,我們發現,在第五部分的第5步其實並不一定要勾選WITH_demos和WITH_examples生成sln,因爲我們可以選擇…\CGAL-4.13.1\demo或者…\CGAL-4.13.1\examples的某一個項目然後用cmake去編譯生成,中間有一個小插曲,如果用cmake configure和generate生成出的某一個項目只有ALL_BUILD和ZERO_CHECK卻沒有你想要的工程,原因是用普通權限或者用戶權限generate時cmake沒有識別出環境變量CGAL_DIR的目錄,記得在窗口的value值加上,這樣就好了~

七、參考資料

Qt5的安裝
CGAL編譯與配置
CGAL配置的一點心得(各種錯誤的解決辦法)
CGAL配置後使用時遇到的一些問題及解決方法
CGAL在VS2013中的安裝關鍵問題的解決
CGAL DEMO 演示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章