天天看點

QCAD v3.23.0.2源碼編譯,使用VS2017+Qt5.12.5環境

QCAD 是一個免費、開源的計算機輔助繪圖二維工具,功能強大。目前開源的二維CAD有QCAD、LibreCAD等,LibreCAD可以說是QCAD的分支版本。對比這兩款開源軟體,LibreCAD是純C++開發,有boost庫的依賴,源碼比較重,而QCAD使用了Qt的Script子產品(ECMAScript 5 - JavaScript 5),使用了C++和Javascript腳本兩種開發方式。使用腳本來擴充功能比純C++開發效率會高點,因為這些開源項目源碼都很大,編譯比較花時間。如果使用腳本來開發的話,沒有編譯時間,可以邊寫腳本邊測試,很友善。

因為項目的需要,本人選擇QCAD,并對其源碼進行編譯。本篇博文中,使用了VS2017+Qt5.12.5對QCAD v3.23.0.2版本的源碼進行了成功的編譯和運作。

一、環境準備

1、VS2017,Qt5.12.5/x86,Qt VS Tools插件

http://download.qt.io/official_releases/qt/

2、檢查一下Windows環境變量是否正确:

設定Windows的環境變量。推薦使用工具Rapid Environment Editor。

http://www.rapidee.com/

Path=F:\Qt\Qt5.12.5\5.12.5\msvc2017\bin

QTDIR=F:\Qt\Qt5.12.5\5.12.5\msvc2017

3、QCAD官網下載下傳源碼

https://www.qcad.org/en/

 官網域名1

https://www.ribbonsoft.com/en/

 官網域名2

https://qcad.org/en/dxflib-downloads

dxflib庫源碼

https://www.ribbonsoft.com/en/dxflib-downloads https://github.com/qcad/qcad/tree/master/src/3rdparty/dxflib https://www.qcad.org/en/documentation/changelog

曆次版本更新日志

https://github.com/qcad/qcad

QCAD源碼

https://www.ribbonsoft.com/doc/qcad/latest/developer/

4、解壓源碼包,確定以下檔案夾存在(因為QCAD使用了Qt的Script子產品,使用了C++和Javascript腳本兩種開發方式。),若不存在則手動添加:

\QCAD\qcad-3.23.0.2\src\3rdparty\qt-labs-qtscriptgenerator-5.12.5

例如筆者的路徑下原本就沒有qt-labs-qtscriptgenerator-5.12.5,我把qt-labs-qtscriptgenerator-5.12.3拷貝為5.12.5,并且把qt-labs-qtscriptgenerator-5.12.3.pro檔案名修改為qt-labs-qtscriptgenerator-5.12.5.pro

5、打開VS2017,主菜單->Qt VS Tools->打開qcad.pro檔案,最後可能會提示出錯(Import): Error(s): 23,沒關系,不管它。

[15] - MAKEFILE_GENERATOR variable not set as a result of parsing : qcad-3.23.0.2.pro. Possibly qmake was not able to find files included using "include(..)" - enable qmake debugging to investigate more.

[16] - Project MESSAGE: ..\qcad-3.23.0.2

[17] - Project MESSAGE: ..\qcad-3.23.0.2.zip

[18] - Project MESSAGE: ..\qcad-3.vcxproj

[19] - Project MESSAGE: ..\qcad-3.vcxproj.filters

[20] - Project MESSAGE: ..\qcad-3.23.0.2

[21] - Project MESSAGE: ..\qcad-3.23.0.2.zip

[22] - Project MESSAGE: ..\qcad-3.vcxproj

[23] - Project MESSAGE: ..\qcad-3.vcxproj.filters

--- (Import): Error(s): 23

--- (qmake) : Exit Code: 3

二、編譯qcadqt-labs-qtscriptgenerator-5插件(這個插件很重要,必須編譯)

Qt腳本生成器是為Qt腳本生成Qt綁定的工具。 使用生成的綁定,您可以從Qt腳本中通路Qt API的大部分。 該插件源碼來自:

https://github.com/shibukawa/qtscriptgenerator https://github.com/sjinks/qtscriptgenerator

因為qcad與界面相關的功能都是用JavaScript腳本實作,是以需要編譯Qt的腳本實作。找到源碼的src目錄中的3rdparty檔案夾中與Qt版本對應的qt-labs-qtscriptgenerator,裡面會已經生成了VS的解決方案。直接用VS打開解決方案,全部編譯即可。

VS2017打開工程,編譯:

\qcad-3.23.0.2\src\3rdparty\qt-labs-qtscriptgenerator-5.12.5\qcadqt-labs-qtscriptgenerator-5.sln

三、編譯主程式

\qcad-3.23.0.2\qcadqcad.sln

編譯成功後,檔案都會生成在指定的目錄中,直接打開源碼下面的debug檔案中的qcad.exe即可以運作QCAD了。

四、常見問題解答

1、自己編譯的debug或者release版本一運作自動退出了,怎麼回事?

解決辦法:需要編譯qcadqt-labs-qtscriptgenerator-5插件就可以解決。編譯的結果檔案在路徑:

\qcad-3.23.0.2\plugins\script\

注意:qcadqt-labs-qtscriptgenerator-5.sln不管是Debug還是Release的的編譯結果的預設路徑都是同一個,檔案名也相同。這就比較麻煩了,編譯完debug,再編譯release的話,會把debug檔案覆寫掉。這裡請程式員注意一下。如果隻是學習源碼的話,release版本可暫不編譯,隻用debug版本即可了。

2、編譯報錯:error MSB6006: “cmd.exe”已退出,代碼為 2

1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(209,5): error MSB6006: “cmd.exe”已退出,代碼為 2。

1>已完成生成項目“.vcxproj”的操作 - 失敗。

解決辦法:選擇項目,右鍵點選“Convert project to Qt  VS Tools project”,然後再次編譯即可OK!

3、編譯qcadcore和qcad時,報錯:error LNK1104: 無法打開檔案“\.obj”

工程-屬性-連結器-輸入-附加依賴項-lib的路徑錯亂了,如圖:

修改為:

4、編譯qcaddxf報錯:

\qcad-3.23.0.2\src\io\dxf\rdxfimporter.cpp(130): error C2664: “bool DL_Dxf::in(std::istream &,DL_CreationInterface *)”: 無法将參數 1 從“std::ifstream”轉換為“const std::string &”

解決辦法:

#ifdef Q_OS_WIN

   wchar_t* winfn = new wchar_t[2000];

   int len = fileName.toWCharArray(winfn);

   winfn[len] = '\0';

  把 //bool success = dxflib.in(std::ifstream(winfn, std::ifstream::in), this);

替換為bool success = dxflib.in((const char*)fileName.toUtf8(), this);

5、編譯qcadscripts報錯:

4>qrc_scripts_release.obj : error LNK2005: "int __cdecl qInitResources_scripts(void)" (?qInitResources_scripts@@YAHXZ) 已經在 qrc_scripts.obj 中定義

4>qrc_scripts_release.obj : error LNK2005: "int __cdecl qCleanupResources_scripts(void)" (?qCleanupResources_scripts@@YAHXZ) 已經在 qrc_scripts.obj 中定義

4>  正在建立庫 ..\..\plugins\\qcadscripts_debug.lib 和對象 ..\..\plugins\\qcadscripts_debug.exp

4>..\..\plugins\\qcadscripts_debug.dll : fatal error LNK1169: 找到一個或多個多重定義的符号

原因:不小心點選了菜單項Convert custom build steps to Qt/MSBuild

解決辦法:重新打開qcad.pro檔案,生成\qcad-3.23.0.2\src\scripts\qcadscripts.vcxproj.filters和qcadscripts.vcxproj檔案。記住,千萬不要再點選剛才提到的菜單項了。

6、QCAD所有的UI界面都是使用js實作的,入口是:\scripts\autostart.js

QCAD應用程式架構提供了CAD特定的功能,如CAD核心、DXF導出和導入、強大的圖形視圖等。ECMAScript檔案将可用的功能組合到一個應用程式中。QCAD應用程式架構的ECMAScript接口可用于非常快速地建構和擴充CAD特定的應用程式。QCAD使用者界面本身及其所有的互動工具以及大多數小部件和對話框都是通過ECMAScript接口實作的。每個QCAD包都附帶的QCAD可執行檔案本質上是一個腳本解釋器,它具有标準的ECMAScript功能,此外還提供了Qt API和QCAD API的附加類。在一個獨立的環境中運作QCAD可執行檔案将不起任何作用,因為沒有要執行的ECMAScripts。預設情況下,QCAD可執行檔案通過查找一個名為“scripts/autostart.js”的檔案開始執行。在QCAD中,自動啟動腳本初始化了所有ECMAScript工具和使用者界面元件并啟動主應用程式循環。QCAD中目前可用的幾乎所有小部件、菜單和工具都是在ECMAScript中實作的。這些腳本檔案位于下載下傳的QCAD軟體包的“scripts”目錄下。注意,在Mac OS X下,腳本目錄位于“QCAD.app/ content/Resources/scripts”下的應用程式包中。

關于腳本的使用教程:https://www.qcad.org/en/tutorial-script-programming

7、QCAD的軟體配置檔案在:C:\Users\<使用者名>\AppData\Roaming\QCAD\QCAD3.ini

8、如何在windows的dos環境下啟動QCAD?

qcad.exe "C:\Users\firecat\Documents\dxf\555.dxf"

qcad.exe -exec scripts/File/OpenFile/OpenFile.js

9、依賴的Qt lib:

---Debug---

Qt5PrintSupportd.lib

Qt5Svgd.lib

Qt5OpenGLd.lib

Qt5Helpd.lib

Qt5UiToolsd.lib

Qt5Designerd.lib

Qt5Widgetsd.lib

Qt5Guid.lib

Qt5Scriptd.lib

Qt5ScriptToolsd.lib

Qt5Sqld.lib

Qt5XmlPatternsd.lib

Qt5Networkd.lib

Qt5Xmld.lib

Qt5Cored.lib

qtmaind.lib

---Release---

Qt5PrintSupport.lib

Qt5Svg.lib

Qt5OpenGL.lib

Qt5Help.lib

Qt5UiTools.lib

Qt5Designer.lib

Qt5Widgets.lib

Qt5Gui.lib

Qt5Script.lib

Qt5ScriptTools.lib

Qt5Sql.lib

Qt5XmlPatterns.lib

Qt5Network.lib

Qt5Xml.lib

Qt5Core.lib

qtmain.lib

---

相關學習資料:

https://www.cnblogs.com/opencascade/p/qcad.html https://doc.qt.io/qt-5.12/qtscript-index.html

Qt Script

https://doc.qt.io/qt-5.12/qscriptengine.html

QScriptEngine

https://doc.qt.io/qt-5.12/qscriptenginedebugger.html

Qt Script斷點調試

ECMAScript

https://blog.csdn.net/tianyapai/article/category/8548350

QCad源碼分析

https://blog.csdn.net/tianyapai/article/category/8500765

Qt Script翻譯

QCAD與libreCAD的試用及比較,QCAD比libreCAD更好用,功能更強大

繼續閱讀