在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 了。

不依赖官方LibPack编译FreeCAD的一次尝试的更多相关文章

  1. 01按照官方步骤编译NanoPiM1Plus的Android

    01按照官方步骤编译NanoPiM1Plus的Android 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/6 10:58 版本:V1.0 ...

  2. 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)

    最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...

  3. idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在,已解决

    idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在 1. 报错具体情况 2. Project Structure中的Libraries没有任何红色波浪线 3. 发现自己要引 ...

  4. (2)RGB-D SLAM系列- 工具篇(依赖库及编译)

    做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...

  5. java-cef系列视频第一集:从官方代码编译

    本视频介绍了如何从官方给出步骤编译java-cef代码,生成可运行可移植的发行版. 值得一提的是:截至2016-09-24java-cef代码编译方式有所改变,读者请自行查看bitbucket上关于编 ...

  6. Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包

    一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...

  7. Makeflie自动生成依赖,自动化编译

    在netbeans里开发,有一个重要文件makefile,是用来编译所有的文件. 项目的目录结构如下,扁平的目录结构,如何实现自动化编译,写makefile呢? 第一版 基础版: CC = g++ C ...

  8. maven相互依赖导致无法编译成功

    起初是新加了个模块,启动前编译时error,提示找不到依赖模块的类,但java文件上是没有报错的. 后经过排查,发现是循环依赖导致的此问题. 如图,弹出框中有循环依赖的模块会显示红色,右键Open M ...

  9. 【日常记录】用 vs2015 编译 love2d 引擎时出现 依赖项目luajit编译失败的解决办法

    如图片所示,提示是没有找到cmake命令.看来是需要camke软件支持的,由于当初安装CMake后我重装了系统,也没有把cmake的bin路径 解决办法一:重新安装CMake,并勾选上"ad ...

随机推荐

  1. 【zabbix部署】基于linux安装zabbix监控服务和被监控服务

    环境配置 zabbix_server:10.0.0.1 zabbix_agentd:10.0.0.1,10.0.0.2(暂定) 操作系统:centos7.6 安装环境配置 1. LNMP环境 zabb ...

  2. 【每天一题】LeetCode 0028. 字符串匹配

    开源地址:https://github.com/jiauzhang/algorithms 题目描述 * https://leetcode-cn.com/problems/implement-strst ...

  3. How to: Use the Entity Framework Code First in XAF 如何:在 XAF 中使用EF CodeFirst

    This topic demonstrates how to create a simple XAF application with a business model in a DbContext ...

  4. Spring 核心技术与产品理念剖析【下】

    3. Spring Cloud 蝶变重生 Spring 框架的升级演进都是围绕分层架构进行的,从简单到复杂,再回到简单的过程.如果我们没有经历过 Spring 最开始繁琐的配置,然后一步步精简,就根本 ...

  5. python面向对象-1

    1.面向对象的思想优点 优点: 简化代码 ,构建公共模板 ,扩展性强 思想: 类作为模板 ,对象通过模板实例化对象 ,对象去做事 ,抽象将显示存在的事物使用代码体现 2.三大特性 封装(狭义) : 对 ...

  6. echarts 双Y轴图表

    直接代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. Abusing SUDO Advance for Linux Privilege Escalation

    Index What is SUDO? Scenario. Sudoer FIle Syntax. Exploiting SUDO zip tar strace tcpdump nmap scp ex ...

  8. arcgis api for javascript 学习(一) 调用在线发布的动态地图

    1.图中显示为arcgis软件中显示的地图文件 2.调用动态地图主要的是知道动态地图的URL地址 3.通过IDE(webstorm)调用动态地图,如图 4.话不多说,直接上代码 <!DOCTYP ...

  9. C语言 复习函数

    什么是函数呢? 首先函数是在完成特定任务的程序代码中,拥有自己独立的单元. 举个例子 “你可以拿本书吗?” ”你可以拿本语文书吗?“ “你可以拿苹果吗?”..... 如果要是放到程序里面估计要重复很多 ...

  10. MATLAB实例:求相关系数、绘制热图并找到强相关对

    MATLAB实例:求相关系数.绘制热图并找到强相关对 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用MATLAB编程,求给定数据不同维度之间的相关系 ...