Win64下編譯OSG詳細(xì)過程(Win10+VS2015+OSG3.6.3)
1. 數(shù)據(jù)資源準(zhǔn)備
在OSG官方網(wǎng)站上下載最新的源碼包。一般要求下載三個(gè)包:
- OpenSceneGraph-3.6.3,OSG的源碼包。
- osg-3rdparty-cmake-master.zip,源碼包依賴的第三方庫(kù)。
- OpenSceneGraph-Data-3.4.0.zip,自帶的一些數(shù)據(jù)資源文件。

同時(shí)還需要提前安裝好VisualStudio環(huán)境,我這里用的VS2015;以及cmake,用來生成VS工程,我這里用的最新的cmake3.13.3。
2. 編譯第三方庫(kù)
在VS2015下官方并沒有提供編譯好的包,只能自己編譯,這一步如果有已經(jīng)編譯好的第三方庫(kù)則可以跳過。建議沒庫(kù)編譯經(jīng)驗(yàn)的同學(xué)用其他VS版本跳過這一步,或者找已經(jīng)編譯好的版本(本文最后提供已經(jīng)編譯好的版本)。
解壓下載好的第三方庫(kù)包osg-3rdparty-cmake-master,就會(huì)發(fā)現(xiàn)里面有個(gè)download_dependencies.bat,用記事本打開:

也就是說第三方庫(kù)源代碼需要通過這個(gè)批處理文件來獲取,最后會(huì)下載到C:\3rdparty這個(gè)文件夾(不想下載可以從本文最后處地址獲取)。里面有三個(gè)cmd不識(shí)別的命令:git、curl以及7z。可以參考《Git安裝教程(windows)》來安裝git;參考《windows(64位)下使用curl安裝》來安裝curl;至于7z可以安裝7-Zip。
都安裝好以后,將download_dependencies.bat加載cmd里面運(yùn)行,等待下載完成就可以了,注意在cmd里面檢查批處理命令的輸出結(jié)果。
下載完成以后,打開cmake,填入source目錄以及build目錄,點(diǎn)擊configure,選擇VS2015-64位編譯器,configure完成后,按照如下配置進(jìn)行再次configure,直到?jīng)]有紅色高亮顯示。

點(diǎn)擊Generate生成VS工程,用VS2015打開,生成解決方案,等待編譯完成就可以了。編譯完成后單獨(dú)生成INSTALL工程,編譯結(jié)果就會(huì)自動(dòng)安裝到CMAKE_INSTALL_PREFIX設(shè)置的文件夾。
3. 編譯GDAL
可參看我的另外一篇文章《Win64下編譯集成GEOS和Proj4的GDAL》。建議不熟悉GDAL的同學(xué)直接找編譯好的版本就可以了。或者直接略過,GDAL應(yīng)該只是可選的編譯項(xiàng)之一。
4. 編譯OSG
解壓源碼包,文件夾重命名為OpenSceneGraph-3.6.3。啟動(dòng)cmake,填入源代碼路徑和編譯路徑,點(diǎn)擊Configure,界面就會(huì)出現(xiàn)一些編譯選項(xiàng)。

之前很多資料說多Configure幾次,cmake會(huì)把有問題的地方紅色高亮顯示。但是到我這里最后紅色高亮卻消失了,只是會(huì)提示找不到對(duì)應(yīng)的類庫(kù)。以防萬一我還是將這些依賴庫(kù)一一配置進(jìn)去了。注意配置以下幾個(gè)選項(xiàng):
1) CMAKE_INSTALL_PREFIX:
cmake得到的工程都有install工程,生成之后就會(huì)自動(dòng)把需要的頭文件、lib還有dll復(fù)制到對(duì)應(yīng)的目錄中去,這樣方便我們管理。可以把這里設(shè)置成一個(gè)我們想要的目錄,我這里設(shè)置的是D:\Work\OSGBuild\OpenSceneGraph-3.6.3\install。
2) BUILD_OSG_EXAMPLES/BUILD_MFC_ EXAMPLE:
這兩個(gè)都是OSG的示例,可以勾選編譯進(jìn)去方便以后學(xué)習(xí)。
3) ACTUAL_3RDPARTY_DIR
這里設(shè)置成第三方庫(kù)的路徑,我這里設(shè)置成上面編譯好的第三方庫(kù)安裝路徑:D:\Work\OSGBuild\osg-3rdparty-cmake-master\install。當(dāng)然這里也可以是下載的已經(jīng)編譯好的第三方路徑。
設(shè)置好這三項(xiàng),再次Configure。第三方庫(kù)有9個(gè):zlib、libpng、libjpeg、libtiff、FreeType、GLUT、GIFLIB、MINIZIP、curl,再加上一個(gè)GDAL。仔細(xì)看輸出,如果存在庫(kù)沒找到,則會(huì)提示對(duì)應(yīng)的庫(kù)Could NOT find。

如果一旦發(fā)現(xiàn)沒找到對(duì)應(yīng)的庫(kù),可以回頭找對(duì)應(yīng)的配置項(xiàng)。勾選Grouped和Advanced可以方便查找,以下是我自己配置的路徑。

仔細(xì)看就會(huì)知道萬變不離其宗,簡(jiǎn)單來說就是include找頭文件,library找.lib,debug找debug的.lib,release找release的.lib。
4) BUILD_DOCUMENTATION
勾選這個(gè),可以生成編譯OSG幫助文檔的工程,可參照這篇文章《VS2010+64+OSG3.2.1之一幫助文檔的生成》。注意這篇文章的第三個(gè)設(shè)置好像沒必要了,可以直接生成chm。
5) 編譯過程的問題
修改以上配置Configure沒有問題之后,點(diǎn)擊Generate,就可以生成工程文件。用VS2015打開工程,生成解決方案,剩下的就是漫長(zhǎng)的等待了。編譯完成之后有個(gè)osgviewerMFC生成錯(cuò)誤:

在網(wǎng)上查找解決方案,原因是VS2015已經(jīng)不支持太遠(yuǎn)古的VC了。在這個(gè)項(xiàng)目的stdafx.h文件中,找到WINVER和_WIN32_WINNT的宏定義,修改為
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows XP or later.
#define WINVER 0x0601 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0601 // Change this to the appropriate value to target other versions of Windows.
#endif
也就是將0x501修改為0x0601,這段的含義也就是指定需要win7及以上版本的windows來運(yùn)行。
再次生成解決方案,編譯就沒有問題了。
6) 安裝
分別僅單獨(dú)生成doc_openscenegraph和doc_openthreads,就會(huì)生成幫助文檔。僅單獨(dú)生成INSTALL,OSG的所有依賴、文檔就會(huì)發(fā)送到CMAKE_INSTALL_PREFIX設(shè)置的目錄中。最后目錄中的結(jié)果:

5. 測(cè)試環(huán)境
看了很多資料基本上都是在安裝絕對(duì)環(huán)境,好處是配置好了本機(jī)哪里都可以通過文件名調(diào)用,不過壞處是一旦存在相同的dll環(huán)境或者換了電腦就麻煩了。我這里習(xí)慣配置相對(duì)環(huán)境,只要拷貝好代碼,在任何電腦都可以直接使用,不用費(fèi)心再配置一次。
如下圖所示,建立文件夾:

將我們剛剛編譯的OSG的dll拷貝到bin/bin_D目錄里面,帶_D的表示是debug版本,注意第三方庫(kù)的dll也應(yīng)該拷貝進(jìn)去。include文件夾就是OSG安裝的include文件夾,里面是OSG的頭文件。lib/lib_D則放入OSG的lib文件。HelloOSG就是我們用VS2015新建的空白win32控制臺(tái)工程。
在新建main.cpp文件,編寫下面代碼:
//main.cpp
#include <iostream>
#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
using namespace std;
int main()
{
//這里修改成OSG數(shù)據(jù)包里面的實(shí)例數(shù)據(jù)
string osgPath = "D:\\Work\\OSGBuild\\OpenSceneGraph-Data\\cow.osg";
osgViewer::Viewer viewer;
osg::Node * node = new osg::Node;
node = osgDB::readNodeFile(osgPath);
viewer.setSceneData(node);
return viewer.run();
}
在工程屬性中,按照如下設(shè)置:
- 指定頭文件文件夾
![]()
- 指定lib文件夾
![]()
- 指定lib文件
![]()
- 指定dll的文件夾
![]()
大家可以配置一個(gè)選項(xiàng)然后編譯運(yùn)行試試,就可以體會(huì)到程序具體是如何使用C/C++動(dòng)態(tài)庫(kù)的。注意debug設(shè)置debug目錄,release設(shè)置release目錄。由于我這里都是設(shè)置的相對(duì)目錄,即使換了電腦仍然可以使用。最后運(yùn)行的結(jié)果:

6. 資源下載
全套的編譯資源(包含編譯的chm幫助)都已經(jīng)上傳到網(wǎng)盤:https://pan.baidu.com/s/1V5c2_XO1167y3yg1S9OEFA ,密碼:70fh。

其中第一個(gè)文件夾內(nèi)就是第2節(jié)提到的bat命令下載的第三方源碼。所有的動(dòng)態(tài)庫(kù)都是VS2015-64位編譯的,包含了debug和release兩套dll。





浙公網(wǎng)安備 33010602011771號(hào)