首先不得不說,要感謝北京郵電大學的阿科。感謝他慷慨的分享和極具科學態度的記錄,將自己搜集到的眾多資料收集整理發布,拯救眾多苦逼尋找方案的程序員於苦海之中。因為最近接手新的項目,涉及到使用opengl做surface plot編程。第一個想到的就是能否使用現有的開源API來完成這些工作。通過多方尋找,我發現了兩個開源的project:
1 qwtplot3d(http://qwtplot3d.sourceforge.net/web/navigation/feature_frame.html)
2 Sapphire-3D-Surfaces(http://qt-apps.org/content/show.php/Sapphire+3D+Surfaces?content=118944)
注意這里我使用的開發環境是Qt,語言為C++。
第二個下載源代碼,再win7的Qt Creator一下就編譯通過了。但是第一個卻很艱難,於是各方尋找解決方案,最終在阿科的博客中找到了比較詳細的解決方法,原文鏈接:(http://blog.csdn.net/qinpanke/article/details/8062517)
阿科的方法基本是正確的,但是在細節上與我的實際實驗結果有所不同,我將以阿科的內容為基礎,增加一些自己實際實驗的內容。
1、從網上下載qwtplot3D的最新版本:http://qwtplot3d.sourceforge.net/
2、解壓qwtplot3d-0.2.7.zip到C盤根目錄下(注意:路徑中不能帶有中文漢字)。
3、打開C:\qwtplot3d-0.2.7\qwtplot3d,將會看到qwtplot3d.pro文件。
4、用QtCreator打開qwtplot3d.pro文件,並執行編譯命令會出現如下如下錯誤:No rule to target 'Makefile.Debug'. Stop.如下圖所示:
解決方法:
雙擊並打開上圖左側中的qwtplot3d.pro文件,修改該文件部分內容: win32:TEMPLATE= vclib 修改為: win32:TEMPLATE= lib
5、修改完成后,再次點擊編譯運行。會再次出現錯誤:'stderr' was not declared in this scope 和 'fprintf' was not declared in this scope。 如下圖所示:
解決方法:
打開左側Source》src》qwt3d_function.cpp文件。並在頂部添加語句:#include "stdio.h"
6、再次編譯。即可順利完成qwtplot3d工程的編譯,不會再遇到錯誤。
(這個地方實際還是會有錯誤的,會出現紅色的輸出提示“The process could not be started!”,但是已經生成了C:\qwtplot3d-0.2.7\qwtplot3d-build-desktop\lib目錄下面的libqwtplot3d.a和qwtplot3d.dll,只要生成了就可以了,由上面的錯誤沒有關系)
此時,打開C:\qwtplot3d-0.2.7\qwtplot3d-build-desktop\lib文件夾。會看到生成兩個動態庫文件:libqwtplot3d.a和qwtplot3d.dll。這就是編譯好的qwtplot3d的動態庫文件。作為開發而言,就可以直接使用。當然,我們不僅僅是希望編譯生成動態庫,還希望將qwtplot3d自帶的Demo編譯並運行通過。沒問題,繼續看下面的。
復制C:\qwtplot3d-0.2.7\qwtplot3d-build-desktop\lib文件夾到C:\qwtplot3d-0.2.7\qwtplot3d\下面
7、編譯qwtplot3d自帶的Demo程序。打開C:\qwtplot3d-0.2.7\qwtplot3d\examples文件夾。用QtCreator打開example.pro文件,點擊編譯運行,同樣會出現No rule to target 'Makefile.Debug'. Stop的錯誤。這里需要修改的pro文件是common.pro文件。
解決方法:
打開common.pro文件。刪除語句:TEMPLATE = vcapp和 QMAKE_LFLAGS += /NODEFAULTLIB:msvcrt
8、修改完成后,再次編譯example.pro文件會出現 :: error: ../../lib/qwtplot3d.lib: No such file or directory 。(注意:也可能是出現無法 make 的錯誤。其實也是這個原因導致的,同樣按照下面的修改方法也可以解決)
修改方法:
打開common.pro文件。修改語句:LIBS+= ../../lib/qwtplot3d.lib 修改為:LIBS+= ../../lib/libqwtplot3d.a(這里換成那個dll的動態鏈接庫文件也是可以的,因為.a文件是linux下的動態鏈接庫文件,而.dll是window下面的動態鏈接庫文件)
9、修改完成后,再次編譯example.pro文件就不會出現錯誤。但是,編譯完成運行的時候出現:
Starting C:\qwtplot3d-0.2.7\qwtplot3d\examples-build-desktop\bin\autoswitch.exe...
C:\qwtplot3d-0.2.7\qwtplot3d\examples-build-desktop\bin\autoswitch.exe exited with code -1073741515
出現這個問題的原因是動態庫沒有在example生成的可執行文件的目錄下。
解決方法:
打開C:\qwtplot3d-0.2.7\qwtplot3d\lib文件夾,拷貝兩個文件libqwtplot3d.a和qwtplot3d.dll。到文件夾:C:\qwtplot3d-0.2.7\qwtplot3d\examples-build-desktop\bin。(注意:這是我example生成的文件夾,要看一下你自己的生成的是不是這個位置)
10、正確運行。看一下運行結果吧。
實際的運行結果有多個,因為這個example里面有很多個例子,可以選擇運行哪個例子:
運行結果大家可以看阿科的博客,也可以自己嘗試,是出現不同的surface plot圖像。