1. 數據資源准備
在OSG官方網站上下載最新的源碼包。一般要求下載三個包:
- OpenSceneGraph-3.6.3,OSG的源碼包。
- osg-3rdparty-cmake-master.zip,源碼包依賴的第三方庫。
- OpenSceneGraph-Data-3.4.0.zip,自帶的一些數據資源文件。
同時還需要提前安裝好VisualStudio環境,我這里用的VS2015;以及cmake,用來生成VS工程,我這里用的最新的cmake3.13.3。
2. 編譯第三方庫
在VS2015下官方並沒有提供編譯好的包,只能自己編譯,這一步如果有已經編譯好的第三方庫則可以跳過。建議沒庫編譯經驗的同學用其他VS版本跳過這一步,或者找已經編譯好的版本(本文最后提供已經編譯好的版本)。
解壓下載好的第三方庫包osg-3rdparty-cmake-master,就會發現里面有個download_dependencies.bat,用記事本打開:
也就是說第三方庫源代碼需要通過這個批處理文件來獲取,最后會下載到C:\3rdparty這個文件夾(不想下載可以從本文最后處地址獲取)。里面有三個cmd不識別的命令:git、curl以及7z。可以參考《Git安裝教程(windows)》來安裝git;參考《windows(64位)下使用curl安裝》來安裝curl;至於7z可以安裝7-Zip。
都安裝好以后,將download_dependencies.bat加載cmd里面運行,等待下載完成就可以了,注意在cmd里面檢查批處理命令的輸出結果。
下載完成以后,打開cmake,填入source目錄以及build目錄,點擊configure,選擇VS2015-64位編譯器,configure完成后,按照如下配置進行再次configure,直到沒有紅色高亮顯示。
點擊Generate生成VS工程,用VS2015打開,生成解決方案,等待編譯完成就可以了。編譯完成后單獨生成INSTALL工程,編譯結果就會自動安裝到CMAKE_INSTALL_PREFIX設置的文件夾。
3. 編譯GDAL
可參看我的另外一篇文章《Win64下編譯集成GEOS和Proj4的GDAL》。建議不熟悉GDAL的同學直接找編譯好的版本就可以了。或者直接略過,GDAL應該只是可選的編譯項之一。
4. 編譯OSG
解壓源碼包,文件夾重命名為OpenSceneGraph-3.6.3。啟動cmake,填入源代碼路徑和編譯路徑,點擊Configure,界面就會出現一些編譯選項。
之前很多資料說多Configure幾次,cmake會把有問題的地方紅色高亮顯示。但是到我這里最后紅色高亮卻消失了,只是會提示找不到對應的類庫。以防萬一我還是將這些依賴庫一一配置進去了。注意配置以下幾個選項:
1) CMAKE_INSTALL_PREFIX:
cmake得到的工程都有install工程,生成之后就會自動把需要的頭文件、lib還有dll復制到對應的目錄中去,這樣方便我們管理。可以把這里設置成一個我們想要的目錄,我這里設置的是D:\Work\OSGBuild\OpenSceneGraph-3.6.3\install。
2) BUILD_OSG_EXAMPLES/BUILD_MFC_ EXAMPLE:
這兩個都是OSG的示例,可以勾選編譯進去方便以后學習。
3) ACTUAL_3RDPARTY_DIR
這里設置成第三方庫的路徑,我這里設置成上面編譯好的第三方庫安裝路徑:D:\Work\OSGBuild\osg-3rdparty-cmake-master\install。當然這里也可以是下載的已經編譯好的第三方路徑。
設置好這三項,再次Configure。第三方庫有9個:zlib、libpng、libjpeg、libtiff、FreeType、GLUT、GIFLIB、MINIZIP、curl,再加上一個GDAL。仔細看輸出,如果存在庫沒找到,則會提示對應的庫Could NOT find。
如果一旦發現沒找到對應的庫,可以回頭找對應的配置項。勾選Grouped和Advanced可以方便查找,以下是我自己配置的路徑。
仔細看就會知道萬變不離其宗,簡單來說就是include找頭文件,library找.lib,debug找debug的.lib,release找release的.lib。
4) BUILD_DOCUMENTATION
勾選這個,可以生成編譯OSG幫助文檔的工程,可參照這篇文章《VS2010+64+OSG3.2.1之一幫助文檔的生成》。注意這篇文章的第三個設置好像沒必要了,可以直接生成chm。
5) 編譯過程的問題
修改以上配置Configure沒有問題之后,點擊Generate,就可以生成工程文件。用VS2015打開工程,生成解決方案,剩下的就是漫長的等待了。編譯完成之后有個osgviewerMFC生成錯誤:
在網上查找解決方案,原因是VS2015已經不支持太遠古的VC了。在這個項目的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來運行。
再次生成解決方案,編譯就沒有問題了。
6) 安裝
分別僅單獨生成doc_openscenegraph和doc_openthreads,就會生成幫助文檔。僅單獨生成INSTALL,OSG的所有依賴、文檔就會發送到CMAKE_INSTALL_PREFIX設置的目錄中。最后目錄中的結果:
5. 測試環境
看了很多資料基本上都是在安裝絕對環境,好處是配置好了本機哪里都可以通過文件名調用,不過壞處是一旦存在相同的dll環境或者換了電腦就麻煩了。我這里習慣配置相對環境,只要拷貝好代碼,在任何電腦都可以直接使用,不用費心再配置一次。
如下圖所示,建立文件夾:
將我們剛剛編譯的OSG的dll拷貝到bin/bin_D目錄里面,帶_D的表示是debug版本,注意第三方庫的dll也應該拷貝進去。include文件夾就是OSG安裝的include文件夾,里面是OSG的頭文件。lib/lib_D則放入OSG的lib文件。HelloOSG就是我們用VS2015新建的空白win32控制台工程。
在新建main.cpp文件,編寫下面代碼:
//main.cpp
#include <iostream>
#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
using namespace std;
int main()
{
//這里修改成OSG數據包里面的實例數據
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();
}
在工程屬性中,按照如下設置:
- 指定頭文件文件夾
- 指定lib文件夾
- 指定lib文件
- 指定dll的文件夾
大家可以配置一個選項然后編譯運行試試,就可以體會到程序具體是如何使用C/C++動態庫的。注意debug設置debug目錄,release設置release目錄。由於我這里都是設置的相對目錄,即使換了電腦仍然可以使用。最后運行的結果:
6. 資源下載
全套的編譯資源(包含編譯的chm幫助)都已經上傳到網盤:https://pan.baidu.com/s/1V5c2_XO1167y3yg1S9OEFA ,密碼:70fh。
其中第一個文件夾內就是第2節提到的bat命令下載的第三方源碼。所有的動態庫都是VS2015-64位編譯的,包含了debug和release兩套dll。