1. 程式人生 > >Qt5.8_VTK7.0_VS2015編譯配置及測試中問題

Qt5.8_VTK7.0_VS2015編譯配置及測試中問題

最近在做一個基於Qt的三維點雲軟體,涉及到點雲的顯示及操作,所以要在Qt中完成QVTKWidget外掛的新增。在浮躁的心態下折騰了兩天才成功的實現Qt5.8_VTK7.0_VS2015的編譯配置及測試。
整個過程中反思和收穫並存:
反思:過程過於浮躁,查閱資料時不夠耐心!!
收穫:新的知識(VTK/CMake/快速提取某一資料夾中檔名等)

以下是整個過程中一些注意事項和測試中遇到的問題:

1.配置
整個配置過程主要參考[dedje]的文章,雖然所用的版本都不一樣,但整個過程還是相同的。只是針對下面過程進行一個詳細說明。
這裡寫圖片描述
該過程中拷貝的QVTKWidgetPlugin.dll和QVTKWidgetPlugin.lib都位於解決方案中的相關目錄,我的是D:\Software\Qt\VTK7.0_sln\bin\Release和D:\Software\Qt\VTK7.0_sln\lib\Release。
2.測試中問題


按照[dedje]博友給出的測試程式碼,測試還是出現問題
這裡寫圖片描述
這裡寫圖片描述
,最終查閱資料發現是因為VS編譯的問題。所以需要在程式碼前新增原始檔。
最終測試程式碼為:

#include "vtkAutoInit.h" 
// 如果編譯時編譯的是OpenGL2,則下面就改為vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkRenderingOpenGL); // VTK was built with vtkRenderingOpenGL
VTK_MODULE_INIT(vtkInteractionStyle);
#include <QtWidgets/QApplication>
#include <vtkSmartPointer.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkImageViewer.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> #include <vtkJPEGReader.h> #include <vtkRenderer.h>
#include <QVTKWidget.h> int main(int argc, char *argv[]) { QApplication a(argc, argv); QVTKWidget widget; widget.resize(256, 256); vtkSmartPointer<vtkSphereSource>sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->Update(); vtkSmartPointer<vtkPolyDataMapper>sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); vtkSmartPointer<vtkActor>sphereActor = vtkSmartPointer<vtkActor>::New(); sphereActor->SetMapper(sphereMapper); vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New(); renderWindow->AddRenderer(renderer); renderer->AddActor(sphereActor); renderer->ResetCamera(); widget.SetRenderWindow(renderWindow); widget.show(); return a.exec(); }

但緊接著又出現以下問題:(搞死了…..)
這裡寫圖片描述
這裡寫圖片描述
對於該問題,只需要到相關VTK7.0的bin資料夾中將相關檔案拷貝到執行目錄中的Debug資料夾下就可以了。
最終完美實現(^o^)/
這裡寫圖片描述

對於無法定位程式輸入點問題,參考了博友xiao_PuZi

C++/CLI的程式,用到了OCCI連線資料庫,程式編譯沒問題,一執行就提示:無法定位程式輸入點*於動態連結庫oraocci12.dll上。
這個時候,需要先確定你的DLL檔案已經放到正確的資料夾下,正確的檔案位置是:C:\WINDOWS\system32。也有人說64位系統,需要放到C:\WINDOWS\SysWOW64路徑下,實測並不需要。
上面的方法不行的話,可以試下:
①、將出問題的dll檔案放到程式的Debug或Release資料夾下;
②、將要用的dll檔案所在的路徑,新增的系統的Path環境變數中。

小知識點
怎樣快速提取資料夾中所有檔案的名字:
為什麼會突然講到這個小技能,因為發現像VTK這種庫在新增依賴項時是一件非常頭疼的事情(其依賴項達到上百個),如果一個個輸入是非常耗時間的。

  1. 找到VTK依賴項資料夾
    這裡寫圖片描述
    2.在該資料夾下新建一個TXT文件
    如:快速提取檔名.txt,並在該文件中新增一些內容:
    這裡寫圖片描述(注意空格)
    3.將文件字尾名改為“.bat”,確認後直接執行,就會在資料夾中生成了LIST.TXT文件
    這裡寫圖片描述
    可能會生成一些無關檔案,只需把相關檔名刪除即可。

:中等笨辦法,如果有博友有更好的方法,希望可以分享下。