天天看點

Cloudcompare插件制作,matlab與C++混合程式設計

寫在前面

由于自己寫的很多處理點雲的代碼是用的matlab,要調用matlab的一些函數,雖然将matlab轉換成C進行調用确實沒太多必要,想要提速還是把代碼重新用C寫一遍更好,但是時間有限,隻能先把matlab轉成C的動态庫,然後制作成cloudcompare插件。

Cloudcompare插件制作

網上大部分的Cloudcompare插件制作工程都是基于cloudcompare源代碼,感覺比較麻煩,每次都需要改cmake檔案,而且源碼編譯有很多工程,如果電腦性能不很好的話,會比較慢。

Cloudcompare插件實際上就是一些動态庫,可以直接建立win32的動态庫工程進行制作(我用的是VS2015和Qt5.8.0)。

在制作Cloudcompare插件之前,先把Cloudcompare源碼編譯一遍,主要是為了生成CCCoreLib.lib、QCC_DB_LIB.lib、QCC_GL_LIB.lib、QCC_IO_LIB.lib等一系列的lib,友善後面調用cloudcompare裡面已有的一些功能(源碼編譯百度一下就OK,很多人都已經寫得很詳細了)。

在編譯完Cloudcompare源碼後,就可以開始制作插件了,打開VS2015,建立win32控制台應用程式,選擇dll(選擇不需要編譯頭),然後把工程裡的所有cpp和h都移除(删除也行),再從cloudcompare源碼的plugins下面随便哪個plugins拷貝cpp和h到建立的win32控制台應用程式目錄下(我用的是qCSF.cpp和qCSF.h,可以把裡面的qCSF類名都改成自己想要的名字),并把cpp和h加入工程中。

配置建立的win32控制台應用程式(也可以從編譯cloudcompare源碼的某個插件工程裡面直接複制過來),

預處理器裡面輸入 WIN32;_WINDOWS;NDEBUG;_SECURE_SCL=0;QT_NO_DEBUG;NOMINMAX;_CRT_SECURE_NO_WARNINGS;__STDC_LIMIT_MACROS;QT_USE_QSTRINGBUILDER;CC_CORE_LIB_USES_DOUBLE;CC_CORE_LIB_USES_CGAL_LIB;CC_CORE_LIB_USES_QT_CONCURRENT;QT_CONCURRENT_LIB;QT_CORE_LIB;QT_OPENGL_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_OPENGLEXTENSIONS_LIB;CC_GDAL_SUPPORT;CC_DXF_SUPPORT;CC_SHP_SUPPORT;CMAKE_INTDIR=“Release”;你的插件名_EXPORTS;

附加包含目錄輸入

D:\CloudCompare-master\build\libs\qCC_db\extern\CCCoreLib\exports;D:\CloudCompare-master\libs\qCC_db\extern\CCCoreLib\include;D:\CloudCompare-master\libs\CCPluginAPI\include;D:\CloudCompare-master\libs\CCPluginStub\include;D:\CloudCompare-master\libs\qCC_glWindow\include;D:\CloudCompare-master\libs\qCC_db\include;D:\CloudCompare-master\libs\CCFbo\include;F:\CPlusPlusLibs\gdal-2.2.0\include;D:\CloudCompare-master\libs\qCC_io\include;D:\CloudCompare-master\libs\qCC_io\extern\dxflib\src;D:\CloudCompare-master\libs\qCC_io\extern\shapelib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtConcurrent;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtCore;F:\Qt\Qt5.8.0\5.8\msvc2015_64.\mkspecs\win32-msvc2015;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtOpenGL;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtWidgets;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtGui;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtANGLE;F:\Qt\Qt5.8.0\5.8\msvc2015_64\include\QtOpenGLExtensions;

附加庫目錄輸入

D:\CloudCompare-master\build\libs\CCPluginAPI\Release\CCPluginAPI.lib;D:\CloudCompare-master\build\libs\CCPluginStub\Release\CCPluginStub.lib;D:\CloudCompare-master\build\libs\qCC_glWindow\Release\QCC_GL_LIB.lib;D:\CloudCompare-master\build\libs\qCC_io\Release\QCC_IO_LIB.lib;D:\CloudCompare-master\build\libs\qCC_io\extern\dxflib\Release\dxflib.lib;D:\CloudCompare-master\build\libs\qCC_io\extern\shapelib\Release\shapelib.lib;F:\CPlusPlusLibs\gdal-2.2.0\lib\gdal_i.lib;D:\CloudCompare-master\build\libs\qCC_db\Release\QCC_DB_LIB.lib;D:\CloudCompare-master\build\libs\qCC_db\extern\CCCoreLib\Release\CCCoreLib.lib;F:\CPlusPlusLibs\cgal-4.10-beta1\lib\CGAL-vc140-mt-4.10.lib;D:\CPlusPlusLibs\gmp\lib\libmpfr-4.lib;D:\CPlusPlusLibs\gmp\lib\libgmp-10.lib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\Qt5Concurrent.lib;D:\CloudCompare-master\build\libs\CCFbo\Release\CC_FBO_LIB.lib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\Qt5OpenGL.lib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\Qt5Widgets.lib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\Qt5OpenGLExtensions.lib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\Qt5Gui.lib;F:\Qt\Qt5.8.0\5.8\msvc2015_64\lib\Qt5Core.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;

配置完之後,如果直接生成,肯定是會報錯的,因為建立的是win32的程式,沒法生成moc檔案,是以還需要自己手動調用Qt的moc.exe編譯生成moc檔案,如下:

moc “D:\Work\VS-Save\CCplugin\qXXXXPlugin.h” -o “D:\Work\VS-Save\CCplugin\moc_qXXXXPlugin.cpp” -I d:\CloudCompare-master\libs\CCPluginStub\include

(最後-I d:\CloudCompare-master\libs\CCPluginStub\include是包含源碼中插件的接口的一些檔案,必須要,否則會出現找不到ccPluginInterface等錯誤,qXXXXPlugin.h是自己的插件檔案)

moc結束之後,将生成的moc_qXXXXPlugin.cpp加入到建立的win32工程中,就能生成插件,将生成的插件拷貝到cloudcompare的安裝目錄下的plugins下面(我的是在F:\Program Files\CloudCompare\plugins),就能在cloudcompare裡面識别,就能正常使用了(如果插件中包含其他ui檔案,則每次改動ui檔案之後,都需要重新uic一下,可以把這句指令放在項目屬性->生成事件->預先生成事件->指令行,uic XXX.ui -o ui_XXX.h)。

上面這樣做完,就可以每次單獨做一個插件就行,不需要在做插件的時候加載那麼多的工程。不足的地方就是不友善和cloudcompare的源碼直接調試。

matlab與C++混合程式設計

前面寫了,自己想用C調用matlab的dll,然後制作成cloudcompare插件,但是有個問題是安裝的cloudcompare(2.11beta 64位)和matlab(R2019b)都依賴于hdf5.dll,而且兩個軟體依賴的hdf5.dll版本不一樣(可能還有其他沖突的庫,我在做完插件在cloudcompare裡面調用的時候總是顯示類似HD5Rereference無法定位于動态庫libmat.dll的錯誤,導緻mclInitializeApplication無法啟動,也就沒法調用matlab生成的dll,應該是cloudcompare和matlab依賴的庫有沖突),嘗試了很多方法,沒法解決。後面隻能是在插件裡面調用exe,exe裡面調用matlab生成的dll,這樣才不會導緻沖突(matlab的m檔案生成C的dll在網上也有,就不寫了,Qt調用外部exe并傳參,在網上也有,也不寫了)。

繼續閱讀