不依赖官方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 了。
不依赖官方LibPack编译FreeCAD的一次尝试的更多相关文章
- 01按照官方步骤编译NanoPiM1Plus的Android
01按照官方步骤编译NanoPiM1Plus的Android 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/6 10:58 版本:V1.0 ...
- 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)
最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...
- idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在,已解决
idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在 1. 报错具体情况 2. Project Structure中的Libraries没有任何红色波浪线 3. 发现自己要引 ...
- (2)RGB-D SLAM系列- 工具篇(依赖库及编译)
做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...
- java-cef系列视频第一集:从官方代码编译
本视频介绍了如何从官方给出步骤编译java-cef代码,生成可运行可移植的发行版. 值得一提的是:截至2016-09-24java-cef代码编译方式有所改变,读者请自行查看bitbucket上关于编 ...
- Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包
一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...
- Makeflie自动生成依赖,自动化编译
在netbeans里开发,有一个重要文件makefile,是用来编译所有的文件. 项目的目录结构如下,扁平的目录结构,如何实现自动化编译,写makefile呢? 第一版 基础版: CC = g++ C ...
- maven相互依赖导致无法编译成功
起初是新加了个模块,启动前编译时error,提示找不到依赖模块的类,但java文件上是没有报错的. 后经过排查,发现是循环依赖导致的此问题. 如图,弹出框中有循环依赖的模块会显示红色,右键Open M ...
- 【日常记录】用 vs2015 编译 love2d 引擎时出现 依赖项目luajit编译失败的解决办法
如图片所示,提示是没有找到cmake命令.看来是需要camke软件支持的,由于当初安装CMake后我重装了系统,也没有把cmake的bin路径 解决办法一:重新安装CMake,并勾选上"ad ...
随机推荐
- javascript中的slice()方法
JavaScript中的Array对象提供了一个slice()方法,用于从已有的数组中返回选定的元素. arrayObject.slice(start, end) 参数说明 start 必需(否则没有 ...
- JAVA集合框架(三)-Map
前言 Map是java中用于存储键值对映射的接口.是解决编程问题最常用的数据结构之一.在工作中,有时候为实现一个功能可能写了好大一段代码,运行是ok了,但是就是不想回头再看,不敢相信自己写的这么烂.这 ...
- zuul实现的限流
限流一般可以根据客户端IP,请求的URL,用户登陆信息进行限制,每秒钟限制多次数,这从别一方面也提升了系统的性能,无用的并发没那么多了. 依赖包 <dependency> <grou ...
- layui table表格 表头与内容列错位问题(只有纵向滚动条的情况)
版本2.4.5 问题展示: 存在问题:正好错位一个纵向滚动条的宽度 思路: 仔细观察th元素及th包裹的子元素div 如下图 发现th宽度莫名的就多了5px 我就纳闷了 解决方案:到table.js ...
- CentOS 安装Asp.net Core & FTP服务
网络设置 确认是否成功连网: ping baidu.com 如果无法上网请检查以下设置 ip link show vim /etc/sysconfig/network-scripts/ipcfg-(看 ...
- 设置自动获取IP和DNS
问题阐述 设置ipv4的自动获取时遇到一个问题,ip和dns自动获取可以确认设置,但是全局时就是报错,回头去看ipv4的ip和dns也还是原来的样子 由于一直使用的都是自动获取,很少会有主动设置ip或 ...
- crontab -e 报错(E518: Unknown option: foldenable)
crontab 默认编辑器为vi,不支持foldenable #crontab -e Error detected while processing /root/.vimrc: line : E518 ...
- java.lang.IllegalStateException: getOutputStream() has already been called 解决办法
因为在使用的时候没有使用@ResponseBody这个注解,所以才会报上面的异常
- js中获取当前url路径
可以使用 window.location 获取当前页面url.以下是一些简单应用. <script> $(function(){ // 返回 web 主机的域名,如:http://127. ...
- 好用的js片段收藏
1.判断浏览器信息,如果是手机,就跳到手机页面 if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) { wind ...