此次编译的为Slicer-5.2.2版本
史上最全slicer编译踩坑记录。
一、源码下载
git地址:GitHub - Slicer/Slicer at v5.2.2
重要
1、使用clone下来,通过压缩包下载后面需要解决git的问题
git clone -b v5.2.2 --depth=1 git://github.com/Slicer/Slicer
2、构建前将本机python的debug环境先卸载。
3、qt版本要用对。
二、CMake构建
将BUILD_TESTING,Slicer_USE_QtTesting,是否编译测试示例,本文取消选则
1、遇到的问题
-
Could NOT find Patch (missing: Patch_EXECUTABLE)
原因是Patch_EXECUTABLE 路径找不到,因为后面编译时,会用到git 去下载很库文件,所以搜索 patch.exe在本机的位置,手动填写路径即可。
2. Qt5_DIR-NOTFOUND
因为没配置环境变量,所以手动添加即可。(切记不要因为本机有其他版本就去直接使用,不然会得不偿失)使用要求的qt版本。
3. CMake Error at CMake/SlicerCheckCMakeHTTPS.cmake:33 (message):
error: "Timeout was reached"
打开Slicer\CMake\SlicerCheckCMakeHTTPS.cmake文件,将url的地址改为国内可以访问的地址。如www.baidu.com
三、vs编译
1、遇到的问题
1. fatal error C1189: #error: Unsupported platform (invalid pointer size)
dcmtk编译报错:原因为cmake构建x64或者win32平台时未声明 SIZEOF_VOID_P 的问题,我是cmake3.25.0报的错,所以升级到了cmake3.25.2后重新构建完成。
2. X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS: 未声明的标识符
看意思是openssl报的错,所以在cmake时将Slicer_USE_PYTHONQT_WITH_OPENSSL勾掉后重新构建。(我最开始用的qt版本不对,后续换成正确的版本且安装时增加openssl的安装后未发现此错误)
3. Failed to clone repository:
挂了全局代理也会出现这个问题,所以需要我们手动拉下来。打开视图->终端:在powershell中git clone后重新编译即可。
此方法也会有实效的情况,就需要手动将git下来的文件复制到itk、vtk等等这些模块的Remote文件夹中,文件夹命名根据远程模块对应的 .remote.cmake文件中的名称来命名然后重新编译即可。
4.PythonQt报错
使用cmake工具打开 python-build 文件夹重新构建后再打开slicer工程编译。
5.ctk报错
还是说pythonqt的错,然后我们去找具体的报错内容发现是找不到PythonQt.dll
找到D:\Slicer-5.2.2\BUILD64\CTK-build\PythonQt-build的工程目录打开PythonQt的工程,手动编译,成功后再编译slicer工程。
6. python-setuptools报错
通过打开报错文件确定是python 的pip安装第三方库时超时导致的问题,所以我们要解决目前国内目前pip安装国外源超时的问题
因为修改slicer的编译代码替换源很麻烦,所以这里采用永久修改源的方法。
1. 在windows文件管理器中,输入 %APPDATA%,cmd里面输入即可。
2. 会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件
3.在新建的pip.ini文件中输入以下内容
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple
trusted-host = pypi.douban.com
7. swigwin下载失败
挂上代理下载swigwin-4.0.2.zip后放到D:\Slicer-5.2.2\BUILD64\Swig-prefix\src文件夹下重新编译。
8. 无法打开输入文件"optimized.lib"
使用cmake打开D:/Slicer-5.2.2/BUILD64/SimpleITK-build/SimpleITK-build/文件夹
将系统的红圈部分删除,不然就会 Found PythonLibs: optimized;....debug等系统python库依赖的第三方库。然后重新configur、generate后再编译。
9. get_filename_component unknown component optimized
原因还是因为我们本地有python环境造成的,检查编译过的CTK ITK等,是否有python_debug_library有引入本地python包将红圈部分删除后再重新编译。
还有一种简单的方法就是在报错的cmake源码
get_filename_component(PYTHON_LIB_BASE ${PYTHON_LIBRARY} NAME_WE)
改写为
set(PYTHON_LIBRARY "D:/Slicer-5.2.2/BUILD64/python-install/libs/python39.lib")
get_filename_component(PYTHON_LIB_BASE ${PYTHON_LIBRARY} NAME_WE)
10. Variable Slicer_WC_LAST_CHANGED_DATE is expected to be defined.
原因为slicer工程不是git clone下来的所以没有.git文件夹,导致没有调用GIT_WC_INFO宏导致的
有两个方法一个方法是git去拉,不要拉master分支,拉取固定版本。
git clone -b v5.2.2 --depth=1 git://github.com/Slicer/Slicer
,网速不快的话很麻烦,第二种方法是git clone个.git文件夹就停,然后将.git文件夹拷贝到Slicer-5.2.2工程下,然后改写D:\Slicer-5.2.2\CMake\SlicerMacroExtractRepositoryInfo.cmake文件,增加
set(${wc_info_prefix}_WC_TYPE git)
GIT_WC_INFO(${MY_SOURCE_DIR} ${wc_info_prefix})
四:调试
进入到子文件夹Slicer-build中,如果直接用VS打开Slicer.sln,设置SlicerApp为启动项。
如果遇到 缺少QT5widgets.dll,缺少CTKwidget.dll等问题,通过命令行启动,在Slicer-build目录输入下面命令启动即可。
.\Slicer.exe --VisualStudioProject