跳转到内容

OpenSCAD 用户手册/在 Windows 上构建

来自维基教科书,开放世界中的开放书籍

这是一组使用 Microsoft Visual C++ 编译器构建 OpenSCAD 的说明。它自 2012 年左右以来一直没有使用,不太可能正常工作。它在这里维护是为了历史参考目的。

使用 Msys2 系统正在尝试构建更新的版本,请参阅 https://wikibooks.cn/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://www.pythonlang.cn 安装 Python 2.x(不是 3.x)。
  • https://imagemagick.org.cn 安装 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。您还可以更改回滚缓冲区设置。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书