這些天幾乎完全按照網上的教程及教程中提供的編譯庫版本進行編譯蕊肥,到最后進行osgearth編譯時總是一大堆錯誤滑潘,而大多數教程中在進行osgearth cmake配置后诗舰,簡單說了一下進行sln編譯蔓罚,就結束了,似乎都很順利荠耽,沒有對該過程中遇到的錯誤進行介紹和解決钩骇。花了一個周的時間铝量,試了多種版本倘屹,仍然是最后的一大堆不知出處的錯誤,在幾乎快要放棄時慢叨,終于編譯成功了纽匙。本文結合了多篇博客教程和自身的編譯經歷,組織了這篇綜合性的教程拍谐。當然有許多不對的地方烛缔,還望各位大神指正。參考博客: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編譯的第二部分編譯準備中已經說明了文件的結構構建)崖面。把源代碼放到G:\OSGCore\Bulid文件夾中,源代碼解壓后重命名為osgearth-osgearth-2.8.0。
2. 將文件結構構建好之后我們開始進行數據拷貝梯影,首先把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,生成道盏。如下圖所示:(其實這一步就已經生成了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ā)現兩種模式下生成的文件名相同店枣,則看該文件是在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文件斥难,按網上的方法也無法解決,因為這兩個文件確實是使用nmake在debug模式下生成的帘饶。網上的的解決方案: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函數重載的問題步咪,修改方法是在參數前面加上(double),就可以識別出具體調用的哪個sqrt函數了益楼;
xmltester工程的報錯是round函數找不到標識猾漫,修改方法是在該cpp中添加頭文件#include <geos/util/math.h>
,在round函數前面加上名字空間util::, 只做這一步感凤,雖然暫時可以消除錯誤悯周,但是在進行編譯時出現:
error LNK2019: 無法解析的外部符號 "double __cdecl
geos::util::java_math_round(double)" (?java_math_round@util@geos@@YANN@Z),該符號在函數 "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的選項,直接忽略就行亏娜。如果需要,可按照以下網上的步驟進行編譯
下載鏈接: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版本中可能不是上面的截屏那樣的,會出現上圖所示四個或者三個振惰,上面那個圖是四個歌溉,還有一個對應的ZLIB_LIBRARY_RELEASE,那就需要按照下圖的修改方法來修改骑晶,修改后再重新點擊一下Configure痛垛,會出現紅色錯誤,但是不用管桶蛔。 解決方案鏈接為 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狰挡、編譯過程中可能遇到的錯誤及解決方案
在編譯開始后,總會出現一大堆錯誤,而且大多數錯誤是類似“error LNK:無法打開外部文件xxxx”或“無法解析外部函數加叁。倦沧。。它匕。展融。被xxxx給占用”。在osgearth整個解決方案的編譯過程中豫柬,其實最核心的還是Core目錄中的osgEarth告希、osgEarthAnnotaion、osgEarthFeatures烧给、osgEarthSymbology燕偶、osgEarthUtil這五個工程的編譯,只要這五個的debug和release編譯通過了础嫡,則基本上整個的sln工程就可以成功指么。
反過來一般出的錯誤都是在進行這五個項目編譯過程中出現的,一個項目中的debug或release生成的lib文件沒有生成成功榴鼎,導致后續(xù)的工程中l(wèi)ib文件無法生成伯诬,造成一系列的錯誤。如下圖所示
而這五個項目的又是依次依賴的巫财,這五個生成的先后順序是osgEarth盗似、osgEarthSymbology 、osgEarthFeatures 平项、osgEarthAnnotaion赫舒、osgEarthUtil。
因為osgEarthUtil需要前三者或四者的lib或dll庫葵礼,而osgEarthAnnotaion則需要前三者的兩個文件号阿,osgEarthFeatures需要前兩者的文件,osgEarthSymbology僅需要osgEarth提供的兩個文件鸳粉。因此當出現很多錯誤時扔涧,可以按照上面紅字部分的順序,依次單獨編譯届谈,從而排查錯誤所在枯夜。依我個人的編譯過程來看,只要osgEarth的debug和Release編譯成功艰山,osgEarthSymbology一般不會出現錯誤湖雹,而在進行第三個osgEarthFeatures編譯時問題可能較多了。
? ? ? a.在第一次進行osgearth編譯時曙搬,出現了1萬多個錯誤摔吏,都是提示cmath中函數錯誤:
網上的說法是項目中存在某個math文件與VS系統(tǒng)原庫中的math文件名稱相同鸽嫂,可以更改自身項目中的該文件名稱,如gmath.h征讲。但本項目所有的文件都是osgearth源代碼及第三方庫源代碼中的文件据某,不能更改名稱,后來發(fā)現是在osgearth項目中對第三方庫的include設置不對诗箍。
按照網上的教程癣籽,一般都是說在編譯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項目編譯中,出現的錯誤之一是找不到TextureBuffer這個頭文件
而DrawInstanced.cpp中引用了osg庫中的該文件沧奴。后來發(fā)現造成這個錯誤的原因是痘括,我最開始進行編譯的OSG的版本是3.0.0,而在該OSG的源目錄中并沒有這個TextureBuffer滔吠,查看了OSG3.4.1的版本源代碼后發(fā)現這個版本中是存在該文件的纲菌。因此最后只能使用OSG3.4.1重新編譯了OSG,并且換成了64bit的版本疮绷,之后就再也沒有出現這個錯誤翰舌。
c.前文在編譯GEOS中說過,使用nmake編譯得到的Release版本的geos.dll和geos.lib是有效的冬骚,但debug版本的geosd.dll和geosd.lib是無效的椅贱,若使用了這兩個文件懂算,則在進行osgEarth編譯時總是會提示如下錯誤:
這是由于debug使用了Release版本的lib文件,按網上的方法也無法解決庇麦,因為這兩個文件確實是使用nmake在debug模式下生成的计技。網上的方案:https://www.cnblogs.com/lisuyun/p/6410393.html
因此需要使用cmake方式,先生成項目文件女器,再在sln工程中編譯生成geosd.dll/geosd.lib或geos.dll/geos.lib酸役。
d. 在osgEarth目錄中Registry.cpp中會出現MimeTypeExtensionMap與getMimeTypeExtensionMap()不可訪問
后來發(fā)現是因為原來使用的OSG3.0版本中osgDB::Registry文件中這個類和方法是protected的,不可訪問驾胆,而新OSG3.4.0中是卻是public的涣澡,改了版本之后錯誤消失。
e. 在osgEarthSymbology編譯時丧诺,會出現關于Geos的錯誤入桂,如下圖所示
這是由于使用的geos版本太新,原來的public類或方法驳阎,在新版本中變成了protected無法訪問抗愁,因此可以更改到舊版本。
參考:https://blog.csdn.net/worrydog/article/details/71512959
f. osgEarthFeatures編譯時只遇到了"未定義標識符OGR_G_Area"呵晚,后來發(fā)現在github中下載的osgearth2.8版本中蜘腌,GeometryUtils.cpp文件第153行的原來的OGR_G_GetArea函數寫成了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觀察會不會出現下面的圖股淡,出現即表示編譯成功