這些天幾乎完全按照網(wǎng)上的教程及教程中提供的編譯庫版本進行編譯,到最后進行osgearth編譯時總是一大堆錯誤,而大多數(shù)教程中在進行osgearth cmake配置后,簡單說了一下進行sln編譯,就結束了,似乎都很順利,沒有對該過程中遇到的錯誤進行介紹和解決。花了一個周的時間,試了多種版本,仍然是最后的一大堆不知出處的錯誤,在幾乎快要放棄時,終于編譯成功了。本文結合了多篇博客教程和自身的編譯經(jīng)歷,組織了這篇綜合性的教程。當然有許多不對的地方,還望各位大神指正。參考博客:https://blog.csdn.net/qq_34874034/article/details/78630538?locationNum=7&fps=1 https://blog.csdn.net/sunxiaoju/article/details/50396838
一、編譯庫和第三方庫版本介紹
系統(tǒng):Win1064bit
編譯開臺:VS2010
OSG版本:3.4.0
OSGEarth版本:2.8.0
Cmake版本:3.11.0_64bit
Curl版本:7.46.0
Gdal版本:2.2.4
Geos版本:3.5.1
OSGEarth編譯
編譯版本:osg3.4.0+VS2010+win1064bit+osgearth2.8
二、編譯OSG
本教程主要參考下面的鏈接,在實際編譯過程的目錄也是按照該鏈接的中教程創(chuàng)建的,只是教程博主是在G盤,本人是在E盤。
https://blog.csdn.net/qq_34874034/article/details/78630538?locationNum=7&fps=1
三、編譯OSGEarth的準備工作:
目錄構建
1. 我們在G:\OSGCore\osgEarth文件夾下存編譯后工程文件(在本文osg編譯的第二部分編譯準備中已經(jīng)說明了文件的結構構建)。把源代碼放到G:\OSGCore\Bulid文件夾中,源代碼解壓后重命名為osgearth-osgearth-2.8.0。
2. 將文件結構構建好之后我們開始進行數(shù)據(jù)拷貝,首先把G:\OSGCore\Bulid\文件夾下的3rdParty文件夾拷貝到G:\OSGCore\Bulid\OpenSceneGraphic\文件夾下。
四、配置第三方庫
1. 編譯Curl
下載鏈接:https://curl.haxx.se/download/
使用版本Curl-7.46.0
Curl的編譯方式最常用的是先使用cmake進行生成項目,即curl.sln,然后再進行編譯。
cmake的方式如下:
1)打開cmake-gui.exe,將curl壓縮包解壓,在根目錄中新建一個build文件夾,然后將該根目錄中的CmakeList.txt文件拖入cmake中,兩個路徑分別按如圖所示設置。
2)點擊Configure,這時會彈出,完成后會彈出
3)找到CMAKE_INSTALL_PREFIX,填入curl-7.46.0源代碼路徑,configure后,直接Generate,此時就會在build中生成curl.sln的編譯工程。
4)打開build中的curl.sln,生成->批生成,ALL_BUILD中的Debug
x64和Release x64,生成。如下圖所示:(其實這一步就已經(jīng)生成了libcurl.dll和libcurld.dll,以及l(fā)ibcurl.lib和libcurd.lib文件,但仍然需要在生成后進行相關的配置,例如將一些文件配置到system32或SysWOW64,因此要Install,以免在后面發(fā)生錯誤)
5)All_build成功后,再選擇INSTALL的Debug
x64和Release x64,生成,就會將所需要的bin、lib安裝到G:\OSG\osgEarth\curl-7.46.0目錄中,以下是批生成和安裝成功的界面,如下圖所示:
6)在build目錄中搜索*.dll,*.lib,*.h文件,將libcurl.dll和libcurld.dll拷貝到G:\OSG\Build\OpenSceneGraph\3rdParty\bin目錄下,將libcurl.lib和libcurd.lib文件拷貝到G:\OSG\Build\OpenSceneGraph\3rdParty\lib目錄下,將*.h文件拷貝到G:\OSG\Build\OpenSceneGraph\3rdParty\include\curl目錄下。
注意:其中l(wèi)ibcurl.dll,libcurl.lib是在Release模式下生成的,libcurld.dll,libcurld.lib是在Debug模式下生成的,在后期進行其它模塊編譯時也是如此,debug模式生成的文件名,比Release多一個字母d。如果在搜索時發(fā)現(xiàn)兩種模式下生成的文件名相同,則看該文件是在Debug目錄中還是在Release目錄中,如果是Debug目錄,則統(tǒng)一在原名稱后加一個d。
2. 編譯GEOS:
下載鏈接:http://trac.osgeo.org/geos/
本人使用的geos-3.5.1,不建議使用3.6.1,因為這里面的有一些類定義的變量在先前版本中是public,可以直接訪問,但在這個版本中都成了protected不可訪問。(但博客和交流群中很多大牛用3.6.1以上的版本成功了,可自己的卻提示不可訪問,也可能是其它模塊的版本兼容問題吧)。
對于GEOS的編譯,有兩種方式,一種是使用cmake,一種是使用nmake,詳細參考:
https://www.cnblogs.com/airscrat/p/4992570.html
但是使用nmake編譯得到的Release版本的geos.dll和geos.lib是有效的,但debug版本的geosd.dll和geosd.lib是無效的,若使用了這兩個文件,則在進行osgEarth編譯時總是會提示如下錯誤:
這是由于debug使用了Release版本的lib文件,按網(wǎng)上的方法也無法解決,因為這兩個文件確實是使用nmake在debug模式下生成的。網(wǎng)上的的解決方案:https://www.cnblogs.com/lisuyun/p/6410393.html
因此不得不使用cmake方式,先生成項目文件,再在sln工程中編譯。
使用cmake編譯geos,編譯步驟為:
1. 打開cmake,加載geos源碼和定位geos的工程存放位置;
2.點擊configure,會報錯,首先設置CMAKE_INSTALL-PREFIX定位到geos源碼文件目錄;
3.然后打開鏈接https://trac.osgeo.org/geos/browser/trunk/cmake/modules
下載GenerateSourceGroups.cmake文件。
4.將下載后的文件放到使用的cmake3.11.0中,我使用cmake的文件路徑為G:\OSGCore\Bulid\cmake-3.11.0-win64-x64,則將剛才下載的文件拷貝到G:\OSGCore\Bulid\cmake-3.11.0-win64-x64\share\cmake-3.11.0\Modules文件下。然后點擊configure,不報錯了,點擊generate,生成編譯工程文件,然后打開vs2010工程文件,點擊批生成,如圖
然后點擊生成
編譯GEOS 64bit, 第一次批生成可能會有兩個工程失敗,分別是geos_unit和xmltester,所以可以先編譯這兩個工程,方法是右鍵工程名-設置為啟動項,然后生成以后就會報錯,geos_unit工程的報錯是sqrt函數(shù)重載的問題,修改方法是在參數(shù)前面加上(double),就可以識別出具體調(diào)用的哪個sqrt函數(shù)了;
xmltester工程的報錯是round函數(shù)找不到標識,修改方法是在該cpp中添加頭文件#include <geos/util/math.h>
,在round函數(shù)前面加上名字空間util::, 只做這一步,雖然暫時可以消除錯誤,但是在進行編譯時出現(xiàn):
error LNK2019: 無法解析的外部符號 "double __cdecl
geos::util::java_math_round(double)" (?java_math_round@util@geos@@YANN@Z),該符號在函數(shù) "double __cdecl geos::util::round(double)"
(?round@util@geos@@YANN@Z) 中被引用
這時需要把\geos-3.5.1\src\util文件夾下的math.cpp粘貼到\geos-3.5.1\tests\xmltester文件夾下,并且把math.cpp添加到工程xmltester里面就可以了;然后批生成就行了。
5. 編譯后需要轉移以下文件到G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\下的對應位置:(第一個是將geos源碼目錄下的include文件夾下的geos文件夾拷貝到G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\include文件夾中,第二個是將編譯工程文件夾下的include文件下的geos里面的兩個.h文件拷貝到前面的G: \OSGCore\Bulid\OpenSceneGraphic\3rdParty\include\geos中,將編譯后生成的lib文件拷貝到G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\lib下,將編譯后生成的dll拷貝到G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\bin下)。如果找到的兩個dll文件名稱相同,則將debug下的dll的文件的名稱后加上d(文件可以在geos編譯的工程文件里面找)拷貝結束后的文件夾目錄結構:
3. 編譯GDAL
gdal 64bit的編譯,與GEOS有些類似,但比后者簡單,僅使用nmake的方式即可,具體操作方式如下:
1)下載
gdal下載地址:http://trac.osgeo.org/gdal/wiki/DownloadSource
我使用的是gdal2.2.4
解壓后的文件中應該有一個nmake.opt文件,在編譯之前需要修改nmake.opt中的一些配置。
2、”#WIN64=YES”,編譯64位GDAL時,要刪除前面的#。
3、 將
改為:
因為編譯的時候會報錯:
修改之后就不編譯ODBC,然后就用不了ODBC,不過關系不大。
3) 編譯
a. 進入VS2010 X64 本機工具命令提示符,在菜單欄的Visual Studio 2010文件夾下
b. 使用命令行,進入到源代碼目錄
nmake -f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstal
第一個命令是編譯GDAL
第二個、第三個命令是將生成的頭文件、靜態(tài)庫、動態(tài)庫復制到GDAL_HOME目錄。如果需要編譯debug模式,就將第一個命令改成nmake -fmakefile.vc DEBUG=1
4. libzip
libzip(vs10)需要下載(http://pan.baidu.com/s/1o70sB6E 密碼:n9l6),把解壓后的頭文件放到G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\include\libzip下,*.lib放到lib文件夾中,*.dll文件放到bin文件夾中。
5. zlib(minizip)
就用3rdParty/lib下面的zlib.lib和zlibD.lib,頭文件zlib.h下載后放到include中的zlib文件夾下,下載鏈接:http://www.winimage.com/zLibDll/minizip.html
6. 編譯sqlite
注:sqlite的編譯,如果用不到sqlite,則無需加入編譯過程,雖然在后面的osgearth
cmake時會提示有sqlite的選項,直接忽略就行。如果需要,可按照以下網(wǎng)上的步驟進行編譯
下載鏈接:http://www.sqlite.org/download.html
編譯步驟:
1.首先下載兩個壓縮包:http://www.sqlite.org/download.html
2.解壓后,把sqlite-dll-win64-x64-3220000下的兩個文件放到sqlite-amalgamation-3220000解壓后的目錄下,解壓后文件夾重命名為sqlite3。組合成下面所示:
3.可按照下面鏈接中的方法進行編譯:
https://www.cnblogs.com/baipengchao/p/5123346.html
4.按照鏈接中的方法生成debug 和release版本,分別命名為sqlite3d.lib|sqlite3d.dll,sqlite3.lib|sqlite3.dll
5.把sqlite3.lib 和sqlite3.dll拷貝到
G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\bin、G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty\lib
7. 其它庫的編譯
當然還有許多其它庫的編譯,例如Expat,protobuf,這些一般是用不到。同時這些也不需要編譯,只需要進行安裝或者下載已編譯好的壓縮包,把相關文件放到3rdParty的bin,include,lib目錄中就可以。
五、編譯前配置Cmake生成sln
G:\OSGCore\Bulid\osgearth-osgearth-2.8.0:osgearth源碼存放位置
1.配cmake
2.創(chuàng)建64位 cmake 生成工程
具體和OSG編譯文檔的設置方法相似,在設置cmake的時候點擊2010 WIN64即可
3.指定OSG路徑:
4.指定3rdParty路徑:
5.點擊Configure,勾上Advanced,然后依次對CURL;GDAL;GEOS;ZLIB進行處理
其余的見機行事,沒有配置文件的,可以直接忽略
注意:這里需要說的是,ZLIB文件在我們使用的cmake版本中可能不是上面的截屏那樣的,會出現(xiàn)上圖所示四個或者三個,上面那個圖是四個,還有一個對應的ZLIB_LIBRARY_RELEASE,那就需要按照下圖的修改方法來修改,修改后再重新點擊一下Configure,會出現(xiàn)紅色錯誤,但是不用管。 解決方案鏈接為 http://blog.csdn.net/worrydog/article/details/71438588
六、編譯OSGEarth
1、編譯過程
1)如果配置完成后,打開G:\OSGCore\OSGEarth文件夾,打開OSGEARTH工程在,注意是否是64位程序。
2)設置ALL_BUILD的include 包含目錄和庫目錄:
編譯osgearth的過程中,有幾個項目需要設置include包含目錄,主要有:
osgEarthFeatures
osgEarthSymbology
osgEarthUtil
Pluginsosgearth_arcgis
Pluginsosgearth_feature_ogr
Pluginsosgearth_feature_tfs
Pluginsosgearth_feature_wfs
Sampleosgearth_featureinfo
如果嫌一個一個配置太麻煩,可以選擇菜單欄“視圖”—>其它窗口-->屬性管理器,只需配置一個All_build的debug或Realse屬性,所有的項目工程就都具有了相同的包含目錄和庫目錄
3. 生成-批生成,對All_BUILD進行生成,選擇(Debug和Release兩個版本),這段編譯時間是很長的,估計2個小時(也看個人電腦的性能與配置,我的是一個小時不到)。
注意上述的配置include包含目錄文件只是列出了debug的,release的配置方式和debug相同的,重復上述的操作即可
2、編譯過程中可能遇到的錯誤及解決方案
在編譯開始后,總會出現(xiàn)一大堆錯誤,而且大多數(shù)錯誤是類似“error LNK:無法打開外部文件xxxx”或“無法解析外部函數(shù)。。。。。被xxxx給占用”。在osgearth整個解決方案的編譯過程中,其實最核心的還是Core目錄中的osgEarth、osgEarthAnnotaion、osgEarthFeatures、osgEarthSymbology、osgEarthUtil這五個工程的編譯,只要這五個的debug和release編譯通過了,則基本上整個的sln工程就可以成功。
反過來一般出的錯誤都是在進行這五個項目編譯過程中出現(xiàn)的,一個項目中的debug或release生成的lib文件沒有生成成功,導致后續(xù)的工程中l(wèi)ib文件無法生成,造成一系列的錯誤。如下圖所示
而這五個項目的又是依次依賴的,這五個生成的先后順序是osgEarth、osgEarthSymbology 、osgEarthFeatures 、osgEarthAnnotaion、osgEarthUtil。
因為osgEarthUtil需要前三者或四者的lib或dll庫,而osgEarthAnnotaion則需要前三者的兩個文件,osgEarthFeatures需要前兩者的文件,osgEarthSymbology僅需要osgEarth提供的兩個文件。因此當出現(xiàn)很多錯誤時,可以按照上面紅字部分的順序,依次單獨編譯,從而排查錯誤所在。依我個人的編譯過程來看,只要osgEarth的debug和Release編譯成功,osgEarthSymbology一般不會出現(xiàn)錯誤,而在進行第三個osgEarthFeatures編譯時問題可能較多了。
? ? ? a.在第一次進行osgearth編譯時,出現(xiàn)了1萬多個錯誤,都是提示cmath中函數(shù)錯誤:
網(wǎng)上的說法是項目中存在某個math文件與VS系統(tǒng)原庫中的math文件名稱相同,可以更改自身項目中的該文件名稱,如gmath.h。但本項目所有的文件都是osgearth源代碼及第三方庫源代碼中的文件,不能更改名稱,后來發(fā)現(xiàn)是在osgearth項目中對第三方庫的include設置不對。
按照網(wǎng)上的教程,一般都是說在編譯curl、geos、gdal等第三方庫后,搜索全部的dll,lib,h文件,在osg源目錄中新建curl、geos、gdal等文件夾,并在這些文件夾中分別創(chuàng)建include,lib目錄,放置各自的h,dll,lib文件,最后在osgearth工程中分別將這些庫的include,lib加載 到包含目錄和庫目錄中,例如:
G:\OSGCore\curl\include
G:\OSGCore\geos\include
這種將各個第三方庫單獨分出來的方式確實有助于后期配置,但會造成osgearth中的某些文件對第三方庫的引用路徑出錯,如#include會提示無法打開export.h文件以及cmath文件中的上述錯誤。為了避免這種錯誤,只需將編譯后的第三方庫中的根目錄中的include文件夾下的文件夾拷貝到"G:\OSGCore\Build\OpenSceneGraph\3rdParty\include"中,如將geos根目錄下的include中的geos文件夾拷貝到上述路徑中。不過對于dll和lib可以不必如此設置,可以在編譯后搜索所有的dll文件,放到G:\OSGCore\Build\OpenSceneGraph\3rdParty\bin目錄下,lib文件放到G:\OSGCore\Build\OpenSceneGraph\3rdParty\lib目錄下,如圖所示
b. osgEarth項目編譯中,出現(xiàn)的錯誤之一是找不到TextureBuffer這個頭文件
而DrawInstanced.cpp中引用了osg庫中的該文件。后來發(fā)現(xiàn)造成這個錯誤的原因是,我最開始進行編譯的OSG的版本是3.0.0,而在該OSG的源目錄中并沒有這個TextureBuffer,查看了OSG3.4.1的版本源代碼后發(fā)現(xiàn)這個版本中是存在該文件的。因此最后只能使用OSG3.4.1重新編譯了OSG,并且換成了64bit的版本,之后就再也沒有出現(xiàn)這個錯誤。
c.前文在編譯GEOS中說過,使用nmake編譯得到的Release版本的geos.dll和geos.lib是有效的,但debug版本的geosd.dll和geosd.lib是無效的,若使用了這兩個文件,則在進行osgEarth編譯時總是會提示如下錯誤:
這是由于debug使用了Release版本的lib文件,按網(wǎng)上的方法也無法解決,因為這兩個文件確實是使用nmake在debug模式下生成的。網(wǎng)上的方案:https://www.cnblogs.com/lisuyun/p/6410393.html
因此需要使用cmake方式,先生成項目文件,再在sln工程中編譯生成geosd.dll/geosd.lib或geos.dll/geos.lib。
d. 在osgEarth目錄中Registry.cpp中會出現(xiàn)MimeTypeExtensionMap與getMimeTypeExtensionMap()不可訪問
后來發(fā)現(xiàn)是因為原來使用的OSG3.0版本中osgDB::Registry文件中這個類和方法是protected的,不可訪問,而新OSG3.4.0中是卻是public的,改了版本之后錯誤消失。
e. 在osgEarthSymbology編譯時,會出現(xiàn)關于Geos的錯誤,如下圖所示
這是由于使用的geos版本太新,原來的public類或方法,在新版本中變成了protected無法訪問,因此可以更改到舊版本。
參考:https://blog.csdn.net/worrydog/article/details/71512959
f. osgEarthFeatures編譯時只遇到了"未定義標識符OGR_G_Area",后來發(fā)現(xiàn)在github中下載的osgearth2.8版本中,GeometryUtils.cpp文件第153行的原來的OGR_G_GetArea函數(shù)寫成了OGR_G_Area,修改后錯誤消失。
目前只能列舉這些,一些錯誤由于沒有備份,忘記了。
3、環(huán)境變量設置及測試
軟件部署(只是列出了debug,release于debug相同)
osgEarth軟件包主要包括五個目錄:bin,data,include,lib,src。
1. G:\OSGCore文件夾下建立一個文件夾path;G:\OSGCore\Path,在path下建立上述五個子目錄,如下圖所示:
2. 組織bin目錄,bin主要包含dll和exe,如下表所示:
拷貝第一項:定位G:\OSGCore\Bulid\OpenSceneGraphic\bin,搜索*.dll和*.exe,拷貝到bin
拷貝第二項:定位G:\OSGCore\OSGEarth,,搜索*.dll,拷貝到bin
拷貝第三項:定位G:\OSGCore\OSGEarth,,搜索*.exe,拷貝到bin
拷貝第四項:定位G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty,搜索*.dll,拷貝到bin
3. 組織data目錄:
首先把G:\OSGCore\Bulid\OpenSceneGraphic\data下的所有拷貝到data
然后把G:\OSGCore\Bulid\osgearth-osgearth-2.8.0\data下的所有拷貝到data
首先把G:\OSGCore\Bulid\osgearth-osgearth-2.8.0\tests下的所有拷貝到data
4.組織include
首先把G:\OSGCore\Bulid\OpenSceneGraphic\include下的所有拷貝到include
然后把G:\OSGCore\Bulid\osgearth-osgearth-2.8.0\src下的所有拷貝到include,可以把該目錄下的.cpp文件刪除,保留.h頭文件。
5.組織Lib和dll
拷貝第一項:定位G:\OSGCore\Bulid\OpenSceneGraphic\lib,搜索*.lib,拷貝到lib
拷貝第二項:定位G:\OSGCore\OSGEarth\x64\Debug,搜索*.lib,拷貝到lib
拷貝第三項:定位G:\OSGCore\Bulid\OpenSceneGraphic\3rdParty,搜索*.lib,拷貝到lib
把osg環(huán)境變量進行一定的修改:
OSG_FILE_PATH:G:\OSGCore\Path\data
PATH:G:\OSGCore\Path\bin
軟件測試
打開cmd,輸入osgearth_viewer
gdal_tiff.earth觀察會不會出現(xiàn)下面的圖,出現(xiàn)即表示編譯成功