在Windows下编译FreeCAD,一般的方法是依赖官方提供的LibPack,可是只有vs2008, vs2012, vs2013等几个版本提供。好比如今感受vs2017比较好用,但是没有官方LibPack,那就很难在vs2017上编译FreeCAD。python
我不想再由于想看看FreeCAD源码,而去安装一个visual studio,不如探索一下,如何不依赖官方LibPack,生成出vs2017的工程项目。git
方向肯定了,那就干起来呗。给cmake传入FREECAD_LIBPACK_USE变量值为 OFF,关闭使用官方LibPack。看看会由于缺乏哪些依赖库而没法经过编译。github
第一个库是 Python,须要确保在PATH路径中找到 Python可执行程序。若是电脑安装过python,cmake也会经过注册表查找。建议采用python3,若是想要debug,那么就必须有debug的python dll。一般的python安装版默认是不带的,能够在安装时选择须要debug的,估计这样会从官网下载仍是怎么的,反正我在一台电脑上安装若是要debug,就老是安装失败,可是另一台电脑却能够安装成功。不知道这是什么缘由。也能够直接下载python源码,里边有个PCBuild目录,vs编译不会太难。只是我也不怎么熟悉python,从源码再安装,不知道那些文件应该怎么放,也懒得比较了。shell
第二个库是 boost,会因为找不到boost而没法继续cmake,能够设置 BOOST_ROOT 指向 boost 安装位置。在这里有个提醒的是,从boost1.65仍是哪一个版本开始,boost.python的dll有所不一样,在 src/Mod/Path/area 有个find_package( Boost COMPONENTS python${BOOST_PY_SUFFIX} ) 按命名查找,好像比较容易查找。推荐 boost1.68以上。这里好像对cmake版本也有要求,我原来是3.9,后面升到3.14.1了。ide
第三个库是 Xerces-C,这个库是读写xml文件的,没有预编译的二进制库可供下载,得去官网下载本身编译。cmake编译这个库没有什么问题。函数
再就是 zlib,直接使用opencascade第三方库里的就能够了,能够设计经过定义 ZLIB_ROOT 让 cmake 找到它。ui
FreeType,缺乏这个,并不会影响cmake生成工程项目文件,只是提示 "Part module will lack of makeWireString()",就是 src/Mod/Part 里的 Part::Module 会缺乏 makeWireString() 函数的实现。debug
Eigen3,缺乏它,也不会影响cmake生成工程项目文件吧,可是会关闭 flatmesh 模块的生成。不过Eigen3是纯C++头文件使用的,添加上并不麻烦。设计
OpenCASCADE,从最新版7.3.0编译出来,再设法让cmake找到它。3d
还有 Coin3D,这是FreeCAD在显示方面所依赖的库。有个 pivy 是对 Coin3D 的python捆绑,在FreeCAD的github库里有,可是 python pip 不能安装。
还有 Qt,没有这个,就得不到UI界面了。不建议Qt4了,给 cmake 传入 BUILD_QT5 为ON 启用Qt5的编译。
PySide2,这是Python对Qt5的捆绑。有些模块会使用 pyside2-rcc.exe 去生成 Qt的资源文件qrc,缺乏它的话,在这些地方会编译失败。能够经过 python 的pip 安装 PySide2。
MedFile,认为这个库很不常见,若是打开 FREECAD_USE_EXTERNAL_SMESH,就不须要 MedFile 了,能够经过 salome找到 med 的源码;还有netgen, hdf5等不少库,数量很多,都是网格方面的,为求简便,也就不追求生成出全部的模块,因此这些都仍是跳过吧。若是真的有切实须要,再来处理它们。
最终结果存储在 个人github-FreeCAD fork,develop分支的 vsbuild 目录,执行脚本 buildscript_vs2017.bat 叠加源码同级目录 FreeCAD-LibPack 能够获得vs2017的工程项目文件。
为了获得这些工程,关闭了很多模块,在运行时也还有问题。这些问题主要出在python方面,最典型的是找不到 shiboken2。
对 FreeCAD 的感受是,在不少的地方都会借助 python 来辅助搭建,好比导入dxf。如今发现好多库都有 python 捆绑,好比vtk,ifcopenshell等等,好像这个世界是 python 的了。
佩服 python,有点酸溜溜,可是也得指明在这些地方,底层还都是C++。我以为FreeCAD若是能够不依赖 python,只是在C++之上提供对 Python 的接口,整个源码是否是会更纯洁好理解一些。
导入dxf是在 Mod/Draft 内定义的,语句 App.addImportType("Autodesk DXF 2D (*.dxf)","importDXF") 代表导入dxf文件会由 importDXF 模块来完成,这对应的是 importDXF.py 文件。看了一下这里的源码,能够发现它又要从另一个地方下载似的。
importDXF.py 里边所有是Python语句,但事实上 Draft/App 之下又存有 C++版的 dxf 格式读写,看起来是向 Heeks 借用的 dxf.h/dxf.cpp。importDXF.py 里在某种状况会调用 C++版的,可是我没成功执行过,缘由是缺乏 shiboken2,这个我恼火的是我已经在 Python 那里安装 PySide2 时会有 shiboken2 呀,为何找不到呢。固然为了保持依赖库在同一个地方(除了Qt以外),我将 Python 拷贝在 FreeCAD-LibPack/Python 里边,同时电脑 C 盘目录之下还有一个python。
刚刚发现 FreeCAD 官方在发布 19_pre 时提供了 FreeCADLibs_12.1.2_x64_VC15.7z ,估计 vs2017 也可使用 官方 LibPack 了。