不依赖官方LibPack编译FreeCAD的一次尝试

在Windows下编译FreeCAD,通常的方法是依赖官方提供的LibPack,但是只有vs2008, vs2012, vs2013等几个版本提供。比如现在感觉vs2017比较好用,可是没有官方LibPack,那就很难在vs2017上编译FreeCAD。

我不想再因为想看看FreeCAD源码,而去安装一个visual studio,不如探索一下,如何不依赖官方LibPack,生成出vs2017的工程项目。

方向确定了,那就干起来呗。给cmake传入FREECAD_LIBPACK_USE变量值为 OFF,关闭使用官方LibPack。看看会因为缺少哪些依赖库而无法通过编译。

第一个库是 Python,需要确保在PATH路径中找到 Python可执行程序。如果电脑安装过python,cmake也会通过注册表查找。建议采用python3,如果想要debug,那么就必须有debug的python dll。通常的python安装版默认是不带的,可以在安装时选择需要debug的,估计这样会从官网下载还是怎么的,反正我在一台电脑上安装如果要debug,就总是安装失败,但是另外一台电脑却可以安装成功。不知道这是什么原因。也可以直接下载python源码,里边有个PCBuild目录,vs编译不会太难。只是我也不怎么熟悉python,从源码再安装,不知道那些文件应该怎么放,也懒得比较了。

第二个库是 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了。

第三个库是 Xerces-C,这个库是读写xml文件的,没有预编译的二进制库可供下载,得去官网下载自己编译。cmake编译这个库没有什么问题。

再就是 zlib,直接使用opencascade第三方库里的就可以了,可以设计通过定义 ZLIB_ROOT 让 cmake 找到它。

FreeType,缺少这个,并不会影响cmake生成工程项目文件,只是提示 "Part module will lack of makeWireString()",就是 src/Mod/Part 里的 Part::Module 会缺少 makeWireString() 函数的实现。

Eigen3,缺少它,也不会影响cmake生成工程项目文件吧,但是会关闭 flatmesh 模块的生成。不过Eigen3是纯C++头文件使用的,添加上并不麻烦。

OpenCASCADE,从最新版7.3.0编译出来,再设法让cmake找到它。

还有 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

导入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 了。

posted @ 2019-05-14 19:24 bitbybit3d 阅读(...) 评论(...) 编辑 收藏