OSG源码编译
本文是基于VS2013+OpenSceneGraph3.6.0進行編譯。
1. 安裝包和工具準備:
如果需要生成幫助文檔,則需要多下載兩個軟件:?
說明:
(1) OSG源碼:OpenSceneGraph-3.6.0,這里使用的是官網穩定版本3.6.0
(2) 第三方依賴庫:3rdParty,這里使用的是VS2013_x64版本,選擇和VS對應版本即可
(3) CMAKE:cmake-3.15.6,這里使用的是3.15.6版本
(4) OSG數據:OpenSceneGraph-Data,這里使用的是3.4.0版本
(5) doxygen:用于生成CHM格式的幫助文檔
(6) graphviz:圖像可視化軟件,用于生成類與類之間的關系圖
?
2.?CMake配置和生成.sln:
- 設定源路徑和構建路徑,其中源路徑選擇OSG源碼路徑,構建路徑放在源碼路徑新建的Build文件夾下(名字可自己定義),如圖所示:
?
- 選擇之后,勾選Advanced,配置構建項。需要設置的地方如下,其余可根據自己需要進行設置:
ACTUAL_3RDPARTY_DIR:第三方依賴庫的位置,默認的一般是錯誤的,填寫3rdParty所在的路徑
BUILD_DOCUMENTATION:是否構建相關文檔,可勾選上
BUILD_MFC_EXAMPLE:是否構建osg的MFC實例代碼,可根據自己需要勾選
BUILD_OSG_APPLICATION:是否編譯OSG的可執行文件,里面包含了osgarchive,osgconv,osgversion,osgviewer
BUILD_OSG_EXAMPLE:是否編譯OSG的默認例子,建議勾選,對前期學習很大幫助
BUILD_OSG_PLUGINS:是否編譯OSG插件,勾選上
CMAKE_INCLUDE_PATH:包含文件目錄,可以不指定,編譯完成后復制
CMAKE_INSTALL_PREFIX:cmake安裝目錄,這里選擇了源碼目錄下,即C:/OSG/OpenSceneGraph-OpenSceneGraph-3.6
CMAKE_LIBRARY_PATH:庫文件目錄,可以不指定,編譯完成后復制
DXYOGEN_DOT_EXECUTABLE:用于生成幫助文檔的osg的類的關系圖,目錄設定為Graphviz目錄下dot.exe的位置,如:D:/Program Files (x86)/Graphviz2.38/bin/dot.exe
DXYOGEN_EXECUTABLE:用于生成CHM幫助文檔,目錄設置為dxyogen目錄下doxygen.exe的位置,如:D:/Program Files/doxygen/bin/doxygen.exe
其余配置按默認選項即可
- 配置完后點擊Configure,如果有問題則修改報錯的配置
-
點擊Generate生成,等待完成
3.? 打開VS2013,打開構建好的sln項目文件(CMake的輸出路徑)下,點擊生成-批生成,勾選ALL_BUILD的Debug和Release版本,點擊確定。整個過程持續4-5小時(6年前的小破本編譯的)
4.?如果編譯失敗,則檢查原因,這里列舉我遇到的兩個問題:
(1)缺少unistd.h文件
- 編譯完成之后報了很多無法打開../../../osgdb.lib的錯誤信息,選擇其中一個項目進行重新編譯,發現是缺少了unistd.h文件,導致所有鏈接庫都生成失敗。
- 在Linux下開發的程序都會有unistd.h這個文件,作用類似于windows下的windows.h的頭文件,而VC沒有這個文件,這時候只需要在第三方依賴庫所在的目錄下的include文件夾下,手動添加進去即可。unistd.h的內容如下:
(2)osgviewerMFC編譯不成功
- 如果在cmake階段勾選了OSG_MFC_EXAMPLE,就會報出一堆宏定義未定義的問題。
?
- 經過檢查發現,這些宏定義都在WinUser.h中有聲明,但是在WINVER>=0x0601才會生效(即Windows Server 2008 R2系統以上才生效),而osgviewerMFC的WINVER版本是0x0501(stdafx.h),屬于XP系統版本,所以是由于版本不兼容導致的問題
- ?檢查osgviewerMFC的預編譯定義(項目-屬性-C/C++-預編譯定義)中,發現該項目是定義為0x0A00(Win10)
?
- ?這時候我們只需要把WINVER修改為0x0A00即可,保證版本統一
- 附上:Window各個版本對應的宏值
| Minimum system required | Macros to define |
| Win8 | _WIN32_WINNT>=0x0602? WINVER>=0x0602 |
| Win7 | _WIN32_WINNT>=0x0601? WINVER>=0x0601 |
| Windows Server 2008 R2 | _WIN32_WINNT>=0x0601? WINVER>=0x0601 |
| Windows Server 2008 | _WIN32_WINNT>=0x0600? WINVER>=0x0600 |
| Windows Vista | _WIN32_WINNT>=0x0600? WINVER>=0x0600 |
| Windows Server 2003 | _WIN32_WINNT>=0x0502? WINVER>=0x0502 |
| Windows XP | _WIN32_WINNT>=0x0501? WINVER>=0x0501 |
| Windows 2000 | _WIN32_WINNT>=0x0500? WINVER>=0x0500 |
| Windows NT 4.0 | _WIN32_WINNT>=0x0400? WINVER>=0x0400 |
| Windows Me | _WIN32_WINDOWS=0x0500? WINVER>=0x0500 |
| Windows 98 | _WIN32_WINDOWS>=0x0410? WINVER>=0x0410 |
| Windows 95 | _WIN32_WINDOWS>=0x0400? WINVER>=0x0400 |
- 然后又報新的錯誤:
第一個問題是因為附加依賴項加了個莫名其妙的路徑,可能是在各種折磨的時候加進去的,刪除即可解決
第二個問題是因為缺少了mfc120.lib的文件,在osgviewerMFC項目中添加庫目錄即可(項目-屬性-VC++目錄-庫目錄)
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\amd64;
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\;
如果以上目錄下沒有這兩個文件,則安裝Multibyte MFC Library for Visual Studio 2013。
解決以后再次批生成,完美解決。
?
5.?再次選擇批生成,這次勾選INSTALL
6.?生成目錄合并
將構建目錄Build下的bin,include和lib拷貝到osg源碼下對應的位置,也可以把兩個目錄下的bin,include和lib都拷貝到單獨的文件夾里面。
7.?配置環境變量:
-
將bin目錄所在的路徑添加到PATH環境變量中:
-
新建系統變量,變量名為:OSG_FILE_PATH,變量值為osg數據所在路徑
-
在命令行(CMD)中輸入命令 osgversion,osglogo,osgviewer cow.osg進行測試,如果成功表示環境配置成功,如果提示缺少zlib.dll,則需要在第三方依賴庫3rdParty中把相應的文件拷貝到bin目錄下
?
8. 編寫第一個osg程序
- 新建一個win32控制臺程序:
-
添加包含目錄:配置屬性-VC++目錄-包含目錄,即最后拷貝好的include目錄
-
添加庫目錄:配置屬性-VC++目錄-庫目錄,即最后拷貝好的lib目錄
-
添加依賴庫:配置屬性-鏈接器-附加依賴項,輸入以下鏈接庫(其中帶d為Debug版本,要一一對應)
-
編寫簡單的測試代碼進行測試,如果成功表示配置環境成功:
?
如果出現外部符號無法解析,原因可能是:
(1)開發平臺不是64位的
(2)依賴項未添加
(3)包含頭文件未添加
(4)庫目錄未添加
所有操作都可以在工程項目中,右鍵屬性中完成
總結
- 上一篇: “低代码”将干掉70%的软件开发工作
- 下一篇: delphi 操作Excel插入图片