跳轉到內容

OpenSCAD 使用者手冊/在 Windows 上構建

來自華夏公益教科書

這是一組使用 Microsoft Visual C++ 編譯器構建 OpenSCAD 的說明。它自 2012 年左右以來一直沒有使用,不太可能正常工作。它在這裡維護是為了歷史參考目的。

使用 Msys2 系統正在嘗試構建更新的版本,請參閱 https://wikibook.tw/wiki/OpenSCAD_User_Manual/Building_on_Microsoft_Windows

---

此 MSVC 構建儘可能靜態,沒有不隨 Windows 一起提供的外部 DLL 依賴項

注意:它上次在 2011 年 12 月的版本上測試。OpenSCAD 的更新簽出可能無法正確構建,或者需要進行大量修改才能在 MSVC 下編譯。2012 年的 OpenSCAD 版本通常使用 Mingw & MXE 系統從 Linux 交叉編譯。請參閱 在 Linux 或 Mac OS X 上交叉編譯到 Windows.

首先下載

  • 安裝 Visual Studio
    • 不需要 siverlight 或 mssql express
    • 您可以使用 MagicDisc 這樣的虛擬 CD 程式來掛載 ISO 檔案,並在不使用 CD 的情況下進行安裝
  • 安裝 QT
    • 安裝到預設位置 C:\Qt\4.7.2\
  • 安裝 Git
    • 單擊 從 Windows 命令提示符執行 Git 和包含的 Unix 工具,儘管有大的紅色字母警告您不要這樣做。
  • 安裝 Cmake
    • 選中“將 cmake 新增到當前使用者的系統路徑”複選框
    • 安裝到預設位置 C:\Program Files\CMake 2.8
  • 安裝 Boost
    • 選擇 VC++ 9.0 vs2008 選項
    • 僅選中“多執行緒靜態執行時”複選框
    • 安裝到 C:\boost_1_46_1\
  • 安裝 CGAL
    • 注意 - CGAL 3.9 修復了早期版本的 CGAL 中的幾個錯誤,但 CGAL 3.9 在沒有大量修補的情況下無法在 MSVC 下編譯。請在使用 MSVC 編譯 OpenSCAD 時記住這一點 - 由於使用 MSVC 所需的 CGAL 版本過時,可能會出現錯誤。
    • 注意它不是二進位制分發,只是一個安裝程式,它安裝了原始碼。
    • 不需要 CGAL 示例和演示
    • 確保選中 mpfr 和 gmp 預編譯庫
    • 安裝程式希望您將其放在 C:\Program Files\CGAL-3.7\ 中,我使用了 C:\CGAL-3.7\
    • 確保選中 CGAL_DIR 環境變數。
  • 安裝 MinGW
    • 確保在元件中選擇 MSYS 基本系統
  • 將下載的 win32_gmp_mpfr.zip 檔案解壓縮到 C:\win32_gmp_mpfr\
  • 將 CGAL 中的 mpfr 和 gmp .h 檔案替換為 win32_gmp_mpfr 中的那些檔案
    • 刪除或移動到臨時資料夾中,CGAL-3.7\auxiliary\gmp\include 資料夾中的所有檔案
    • C:\win32_gmp_mpfr\gmp\Win32\Release 中的所有 .h 檔案複製到 CGAL-3.7\auxiliary\gmp\include
    • C:\win32_gmp_mpfr\mpfr\Win32\Release 中的所有 .h 檔案複製到 CGAL-3.7\auxiliary\gmp\include
  • 將 CGAL 中的 mpfr 和 gmp 庫替換為 win32_gmp_mpfr 中的那些庫
    • 刪除或移動到臨時資料夾中,CGAL-3.7\auxiliary\gmp\lib 資料夾中的所有(2011 年 6 月 20 日 libmpfr-4.lib 是需要的 7/19/11 - 我不需要它)檔案。
    • C:\win32_gmp_mpfr\gmp\Win32\Release\gmp.lib 複製到 CGAL-3.7\auxiliary\gmp\lib
    • C:\win32_gmp_mpfr\mpfr\Win32\Release\mpfr.lib 複製到 CGAL-3.7\auxiliary\gmp\lib
    • 進入 CGAL-3.7\auxiliary\gmp\lib 並將 gmp.lib 複製到 gmp-vc90-mt-s.lib,將 mpfr.lib 複製到 mpfr-vc90-mt-s.lib(這樣連結器可以在 openscad.exe 的最終連結中找到它們)

要獲取 OpenSCAD 原始碼

  • 開啟“Git Bash”(或 MingW Shell)(安裝程式可能已經在您的桌面上放了一個快捷方式)。這將啟動一個命令列視窗。
  • 鍵入 cd c: 以更改當前目錄。
  • 鍵入 git clone git://github.com/openscad/openscad.git 這會將 OpenSCAD 原始碼放到 C:\openscad\ 中

將其他檔案放在哪裡

我將所有依賴項放在 C:\ 中,例如,

  • C:\eigen2\
  • C:\glew-1.5.8\
  • C:\OpenCSG-1.3.2\

.tgz 可以使用 tar -zxvf 從 MingW shell 或 Windows 工具(如 7-zip)中提取。如果需要,請重新命名和移動子目錄。例如,eigen-eigen-0938af7840b0 應該變為 c:\eigen2,其檔案(如 COPYING 和 CMakeLists.txt)直接位於它之下。c:\glew-1.5.8 應該直接在其下有 'include' 和 'lib'。

編譯依賴項

[編輯 | 編輯原始碼]

對於編譯,我使用 QT 開發命令提示符

開始->程式檔案->Qt by Nokia v4.7.2(VS2008 開源)->QT 4.7.2 命令提示符

Qt 需要重新編譯以獲得靜態 C 執行時構建。為此,請開啟命令提示符並執行以下操作

configure -static -platform win32-msvc2008 -no-webkit

配置需要幾分鐘才能完成處理。完成後,開啟檔案 Qt\4.7.2\mkspecs\win32-msvc2008\qmake.conf 並將所有 -MD 例項替換為 -MT。然後

nmake

這需要很長時間。去睡個午覺。吃點東西。在一臺奔騰 4、2.8GHZ CPU、1GB 記憶體、Windows XP 的機器上,它花費了 7 個多小時(那是 -O2 關閉的情況下)

cd C:\CGAL-3.7\
set BOOST_ROOT=C:\boost_1_46_1\
cmake .

現在編輯 CMakeCache.txt 檔案。將所有 /MD 例項替換為 /MT。現在,查詢類似這樣的行

CMAKE_BUILD_TYPE:STRING=Debug

Debug 更改為 Release。現在重新執行 cmake

cmake .

它應該滾動過去,注意顯示 "--Building static libraries""--Build type: Release" 的行,以確認設定正確。還要在 CXXFLAGS 行中查詢 /MT。完成之後,您可以進行構建

nmake

您現在應該在 C:\CGAL-3.7\lib 下有一個 CGAL-vc90-mt-s.lib 檔案。如果沒有,請參閱下面的故障排除。

啟動 Visual Express。

cd C:\OpenCSG-1.3.2
vcexpress OpenCSG.sln
Substitute devenv for vcexpress if you are not using the express version
  • 手動逐步完成專案升級嚮導
  • 確保所有專案的執行時庫設定都為 Release(而不是 Debug)
    • 單擊構建/配置管理器
    • 從“配置:”下拉選單中選擇“釋出”
    • 點選關閉
  • 確保 OpenCSG 專案的執行時庫設定為多執行緒靜態
    • 點選選單項“專案 -> OpenCSG 屬性”(也可能只是“屬性”)開啟 OpenCSG 專案屬性。
    • 確保“配置:”下拉選單中顯示“活動(發行版)”。
    • 點選“配置屬性 -> C/C++ -> 程式碼生成”。
    • 確保“執行時庫”設定為“多執行緒(/MT)”。
    • 點選“確定”。
  • 確保 glew_static 專案的執行時庫設定為多執行緒靜態。
    • 在“解決方案資源管理器 - OpenCSG”窗格中點選“glew_static”專案。
    • 點選選單項“專案 -> OpenCSG 屬性”(也可能只是“屬性”)開啟 OpenCSG 專案屬性。
    • 確保“配置:”下拉選單中顯示“活動(發行版)”。
    • 點選“C/C++ -> 程式碼生成”。
    • 確保“執行時庫”設定為“多執行緒(/MT)”。
    • 點選“確定”。
  • 關閉 Visual Express 並儲存更改。

構建 OpenCSG 庫。您可以使用 GUI 構建/構建選單(示例專案可能會失敗,但 glew 和 OpenCSG 應該成功)。或者,您可以使用命令列

cmd /c vcexpress OpenCSG.sln /build
Again, substitute devenv if you have the full visual studio

cmd /c 部分是必要的,否則您將立即返回到 shell,並且必須等待構建過程完成(除了在任務管理器中檢視之外,沒有指示正在發生這種情況)。

開啟 OpenSCAD。

[編輯 | 編輯原始碼]
  • Bison/Flex:開啟 mingw shell 並鍵入mingw-get install msys-bison。然後對 flex 執行相同的操作:mingw-get install msys-flex
  • 開啟 QT Shell 並複製/貼上以下命令
cd C:\openscad
set INCLUDE=%INCLUDE%C:\CGAL-3.7\include;C:\CGAL-3.7\auxiliary\gmp\include;
set INCLUDE=%INCLUDE%C:\boost_1_46_1;C:\glew-1.5.8\include;C:\OpenCSG-1.3.2\include;C:\eigen2
set LIB=%LIB%C:\CGAL-3.7\lib;C:\CGAL-3.7\auxiliary\gmp\lib;
set LIB=%LIB%C:\boost_1_46_1\lib;C:\glew-1.5.8\lib;C:\OpenCSG-1.3.2\lib
qmake
nmake -f Makefile.Release

等待 nmake 結束。通常會有很多關於連結器的非致命警告。成功後,將在發行版資料夾中出現 openscad.exe 檔案。盡情享受吧。

構建安裝程式

[編輯 | 編輯原始碼]
  • http://nsis.sourceforge.net/Download 下載並安裝 NSIS。
  • 將 FileAssociation.nsh 宏從 http://nsis.sourceforge.net/File_Association 放入 NSIS Include 目錄 C:\Program Files\NSIS\Include 中。
  • 執行“git submodule init”和“git submodule update”將 MCAD 系統(https://github.com/elmom/MCAD)下載到 openscad/libraries 資料夾中。
  • 將 OpenSCAD 的“libraries”和“examples”目錄複製到“release”目錄中。
  • 將 OpenSCAD 的“scripts/installer.nsi”複製到“release”目錄中。
  • 右鍵點選該檔案並使用 NSIS 編譯它。它會生成一個簡單易用的安裝程式。盡情享受吧。

編譯迴歸測試

[編輯 | 編輯原始碼]
  • 按照上述所有步驟操作,構建 openscad,執行它,並測試它是否正常工作。
  • https://python.club.tw 安裝 Python 2.x(不是 3.x)。
  • http://www.imagemagick.org 安裝 Imagemagick。
  • 閱讀 openscad\docs\testing.txt。
  • 進入 QT shell。
set PATH=%PATH%;C:\Python27 (or your version of python)
cd c:\openscad\tests\
cmake . -DCMAKE_BUILD_TYPE=Release
Edit the CMakeCache.txt file, search/replace /MD to /MT
cmake .
nmake -f Makefile
  • 這將在您的目錄中生成多個測試 .exe 檔案。現在執行
ctest

如果您遇到連結問題,請參閱下面的故障排除。

故障排除

[編輯 | 編輯原始碼]

連結器錯誤

如果您在連結期間遇到錯誤,第一步是改進除錯日誌並將其重定向到檔案。開啟 Openscad.pro 並取消註釋此行

 QMAKE_LFLAGS   += -VERBOSE

現在重新執行

 nmake -f Makefile.Release > log.txt

您可以使用“less”(使用“/”搜尋)或 wordpad 等程式來檢視日誌。

要除錯這些錯誤,您必須瞭解 Windows 連結的基本知識。Windows 使用基本的 C 函式(如 malloc())連結到其標準 C 庫。但有四種不同的方法可以做到這一點,如下所示

compiler switch - type - linked runtime C library
/MT - Multithreaded static Release - link to LIBCMT.lib 
/MTd - Multithreaded static Debug - link to LIBCMTD.lib 
/MD - Multithreaded DLL Release - link to MSVCRT.lib (which itself helps link to the DLL)
/MDd - Multithreaded DLL Debug - link to MSVCRTD.lib (which itself helps link to the DLL)

在最終可執行檔案中連結在一起的所有庫都必須使用相同的標準 C 庫連結型別進行編譯。否則,您會遇到連結錯誤,例如“LNK2005 - XXX 已在 YYY 中定義”。但是,如何跟蹤哪個庫連結不正確?1. 檢視日誌,2. dumpbin.exe

dumpbin.exe

dumpbin.exe 可以幫助您確定 .lib 或 .obj 檔案的建立型別。例如,dumpbin.exe /all CGAL.lib | find /i "DEFAULTLIB" 會為您提供 CGAL.lib 中 DEFAULTLIB 符號的列表。查詢 LIBCMT、LIBCMTD、MSVCRT 或 MSVCRTD。根據上表,它會告訴您它是使用靜態發行版、靜態除錯、DLL 發行版還是 DLL 除錯版本構建的。(在此討論中,DLL 當然是指動態連結庫。)這可以幫助您跟蹤例如 LIBCMT 和 LIBCMTD 中衝突符號的連結器錯誤。

dumpbin.exe 還可以幫助您瞭解涉及未解析外部符號的錯誤。例如,如果您遇到有關未解析外部符號 ___GLEW_NV_occlusion_query 的錯誤,但您的 VERBOSE 錯誤日誌表明程式連結了 glew32.lib,那麼您可以使用 dumpbin.exe /all glew32.lib | find /i "occlusion" 來檢視該符號是否實際存在。您可能會看到一個混淆的符號,其中包含 __impl,這會為您提供另一個可以用來谷歌搜尋的線索。在這個特定示例中,應該連結 glew32s.lib(s=靜態),而不是 glew32.lib。

CGAL-vc90-mt-s.lib

編譯後,您可能會得到一個名為 CGAL-vc90-mt.libCGAL-vc90-mt-gd.lib 的檔案,而不是 CGAL-vc90-mt-s.lib。可能有很多原因:您不小心構建了錯誤的版本,或者您可能構建了正確的版本,但 VCExpress 將其命名錯誤。為了仔細檢查並解決問題,您可以執行以下操作

cd C:\CGAL-3.7\lib
dumpbin /all CGAL-vc90-mt.lib | find /i "DEFAULTLIB"
(if you have mt-gd, use that name instead)

如果它顯示引用 LIBCMTD、MSVCRT 或 MSVCRTD 的行,那麼您不小心構建了除錯和/或動態版本,您需要清理構建並嘗試使用正確的設定再次構建以獲得多執行緒靜態發行版。但是,如果它只顯示 LIBCMT,那麼您可能沒問題。查詢另一行,顯示 DEFAULTLIB:CGAL-vc90-mt-s。如果存在,那麼您可能只需要重新命名該檔案即可使其工作。

move CGAL-vc90-mt.lib CGAL-vc90-mt-s.lib

Visual Studio 構建

您可以使用 Visual Studio 的 GUI 構建 CGAL,作為 nmake 的替代方法。您必須使用另一種 cmake 語法。單獨鍵入“cmake”,它會為您提供適用於您機器的“生成器”列表;例如 Visual Studio Express 是 cmake -G"Visual Studio 9 2008" .。這應該為您提供一個有效的 .sln(解決方案)檔案。

然後執行以下命令

vcexpress CGAL.sln 

將構建配置目標修改為發行版(而不是除錯版),並將專案的屬性更改為“/MT”多執行緒靜態構建。這與構建 OpenCSG 使用的類似過程,因此請參考上面的說明以獲取更多詳細資訊。

Unix 使用者注意事項

“MingW Shell”(開始/程式)提供 bash、sed、grep、vi、tar 等工具。C:\ 驅動器在“/c/”下。MingW 包含包,例如:mingw-get install msys-unzip 下載並安裝“unzip”程式。Git 預設包含一些程式,例如 perl。Windows 命令 shell 支援剪下/貼上 - 按下 alt-space。您還可以更改回滾緩衝區設定。

參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書