网上有很多讲解如何编译 CTK 的文章,本文也是对多篇文章的综合和整理。
编译 CTK,主要就是解决下面几个问题:
- Qt 版本
- Qt 路径
- CTKData 路径
- CTK 模块
- CTK 安装路径
下载 CTK 和 CTKData 源码
如果网速好的话,推荐先安装 Git,这样在编译 CTK 的过程中,对于一些依赖的程序包,CMake 会自动调用 Git 进行下载,比如 CTKData。但国内的网络环境,像移动、电信这样的网络状况,我们还是不必期望太高,老老实实自己手动下载更好。
- CTK 源码:https://github.com/commontk/CTK
- CTKData 源码:https://github.com/commontk/CTKData
下载之后,将 CTK-master.zip
和 CTKData-master.zip
分别解压到 D:
盘 D:\CTK-master
和 D:\CTKData-master
文件夹。
编译 CTK
首先下载 CMake:cmake-3.18.0-win32-x86.zip
将下载的 cmake-3.18.0-win32-x86.zip
解压到 D:\cmake-3.18.0-win32-x86
文件夹。
在 D:
盘创建 D:\CTK-Build
文件夹,用于存放编译后的 CTK 文件。
运行 D:\cmake-3.18.0-win32-x86\bin\cmake-gui.exe
,打开 CMake。点击 Browse Source… 按钮,选择 D:/CTK-master
文件夹,再点击 Browse Build… 按钮,选择 D:/CTK-Build
文件夹,如图:
点击 Configure 按钮,在弹出的编译器选择框中选择 Visual Studio 14 2015
,平台选择 x64
,如图:
注意:平台的选择一定要与接下来的 Qt 相对应。比如,后面 Qt 准备选择 msvc2015_64
,所以此处必须选择 x64
平台。
点击 Finish 按钮,完成配置。
错误 1:Qt 版本
此时会遇到第一个错误:Qt4 was not found on your system.
这是由于电脑上安装的是 Qt5,而 CTK 默认配置的是 Qt4。CMake 找不到 Qt4,所以报错。
网上文章解决 CTK 编译错误的方法,大部分都是修改配置文件。本文将采取直接在 CMake 界面上修改配置项的方法。
选中 [Grouped] 和 [Advanced],然后展开 CTK
节点,将 CTK_QT_VERSION
配置项的值由 4
改成 5
。
重新点击 Configure 按钮。
错误 2:Qt 路径
接下来遇到第二个错误:Could not find a package configuration file provided by "Qt5"
这是 CMake 找不到 Qt 5 程序包,我们需要手工指定。
展开 Ungrouped Entries
节点,设置 Qt5_DIR
为正确的 Qt 库路径。一般是类似这样的路径:C:/Qt/Qt5.14.0/5.14.0/msvc2015_64/lib/cmake/Qt5
注意:此处选择的 Qt 库路径,与第一次点击 Configure 按钮时,配置的编译器和平台要一致。
重新点击 Configure 按钮。
错误 3:CTKData 路径
接下来又会遇到第三个错误:could not find git for clone of CTKData
如果最初安装了 Git,此处 CMake 应该会调用 Git 自动下载 CTKData。(没有亲自实践)
由于本文采用的是手动下载的方法,所以此处也需要手动指定 CTKData 路径。
点击 Add Entry 按钮,打开 Add Cache Entry 对话框,添加 CTKData_DIR
配置项,路径指定为 D:/CTKData-master
。
点击 OK 按钮,完成添加。
重新点击 Configure 按钮。
此时顺利完成配置,在底部出现 Configuring done
。
选择要编译的模块
默认配置,只会编译 CTK_LIB_Core
模块。如果我们要生成其它模块,需要手动选择,比如 Widgets 或 Plugin Framework 等。
展开 CTK
节点,选中下列配置项:
CTK_ENABLE_PluginFramework
CTK_ENABLE_Widgets
CTK_LIB_PluginFramework
CTK_LIB_Widgets
CTK_PLUGIN_org.commontk.configadmin
CTK_PLUGIN_org.commontk.eventadmin
CTK_PLUGIN_org.commontk.log
CTK_PLUGIN_org.commontk.metatype
另外,一般情况不需要编译测试模块:展开 Ungrouped Entries
节点,取消选中 BUILD_TESTING
。
重新点击 Configure 按钮,配置完成,在底部出现 Configuring done
。
然后点击 Generate 按钮,在底部出现 Generating done
,同时 Open Project 按钮变为可用状态。
编译程序
点击 Open Project 按钮,启动 Visual Studio,刚才生成的解决方案会自动打开。
在 解决方案资源管理器 里,在 ALL_BUILD
项目名称上点击鼠标右键,在弹出菜单上选择 [生成],开始编译。
大约 8 分钟左右,编译完成(依电脑性能不同,所需时间可能不同)。在底部的 输出 窗口,显示:
========== 生成: 成功 2 个,失败 1 个,最新 0 个,跳过 0 个 ==========
打开 错误列表 窗口,会看到下面这样的错误信息:
注:如果错误列表窗口里没有错误信息,那么重复上面的操作,再生成一次。
双击错误信息,打开 ctkLDAPExpr.cpp
文件,光标会自动定位到 623 行。
去掉该行后面的一对括号,重复上面的操作,再生成一次。
这回输出窗口显示:失败 0 个。
打开 D:\CTK-Build\CTK-build\bin\Debug
文件夹,可见所需文件已经编译成功。
安装 CTK
这时如果仔细查看输出窗口,会在生成成功的提示信息上面发现这样一行:
No install step for ‘CTK’
这说明 CTK 没有安装。这是什么原因呢?
我们单独生成 INSTALL 项目,会发现一堆莫名其妙的错误:
再仔细查看输出窗口,会发现这样的信息:
CMake Error at cmake_install.cmake:36 (file):
file cannot create directory: C:/Program Files (x86)/CTK/lib/ctk-0.1/CMake.
Maybe need administrative privileges.
不能创建目录: C:/Program Files (x86)/CTK/lib/ctk-0.1/CMake. 可能需要管理员权限.
这是无法在 C: 盘创建安装目录。(Win10 对系统盘的权限控制是很严格的。)
回到 CMake 窗口,展开 CMAKE
节点,找到 CMAKE_INSTALL_PREFIX
项,可见其默认值为 C:/Program Files (x86)/CTK
。
修改 CMAKE_INSTALL_PREFIX
的值为 D:/CTK-Install
,然后重新点击 Configure 和 Generate 按钮,窗口底部出现 Configuring done
和 Generating done
。
回到 Visual Studio 窗口,右键点击 INSTALL
项目,选择弹出菜单的 [生成] 项,重新生成安装项目。
这回错误列表里没有错误了,输出窗口也显示“失败 0 个”,但往上看仍然有 No install step for 'CTK'
的提示,查看 D:\CTK-Install
文件夹,里面也没有我们需要的文件。
这说明仍然没有安装成功。
其实在 SuperBuild.cmake
文件里,INSTALL_COMMAND
默认值是 ""
,我们必须手工修改一下。
用记事本打开 D:\CTK-master\SuperBuild.cmake
文件,在文件底部找到 INSTALL_COMMAND ""
一行,修改成 INSTALL_COMMAND ${_INSTALL_CMD}
并保存。
再回到 Visual Studio,再次生成 INSTALL
项目。这回再查看 D:\CTK-Install
文件夹,可见里面包含了 include
和 lib
两个子文件夹,include
文件夹里是 CTK 的头文件,lib
文件夹里是 .lib 和 .dll 文件。