用 Visual C++ 2022 和 CMake 编译 CUnit 静态库
准备工作
源代码获取
CUnit 是知名的 C 语言单元测框架,其源代码最初发布在 sourceforge 上,网址为:https://sourceforge.net/projects/cunit/ 截止到目前为止,最新Release版的版本号是:2.1-3,发布时间是2014年4月24日。
有一些 Fork 自 sourceforge 的后续改进版本,我们选取的是 https://gitlab.com/cunity/cunit 为什么选择它呢?除了它更新时间较新以外,最主要的原因是它提供了一个非常友好的文档页面:https://cunity.gitlab.io/cunit/index.html 代码的文档是非常重要的,其重要性一点也不亚于代码本身。另外,它采用了CMake进行编译管理,这是我喜欢的编译工具。
访问 https://gitlab.com/cunity/cunit/-/releases 这个页面,可以看到当前最新 Release 版本是 3.3.1,更新于2024年5月17日。我们就用它了。下载该本版打包的源代码文件:cunit-3.3.1.zip
编译环境
- Visual Studio 2022
- CMake (版本不应小于 3.5,我实际采用的版本是 3.28.3)
对 CMake 编译脚本的一点修改
cunit-3.3.1.zip 中提供的 CMake 编译脚本CMakeLists.txt
有一点小小的问题,如下所示:
第 7 行的cmake_minimum_required
语句,应该挪到文件最顶行,否则执行这个编译脚本的时候会产生一些错误(警告),修改如下,将第 7 行挪到第 1 行:
编译过程
为什么我不完全采用 CMake 编译?
尽管这一份源代码提供了 CMake 脚本,但它的 CMake 脚本不支持采用CMAKE_BUILD_TYPE
参数设置Debug
或Release
编译类型,这一点我非常不喜欢。通常我在编译 C 或者 C++ 代码库的时候会明确指定:编译目标平台是Win32
还是x64
,编译类型是Debug
还是Release
。这些都必须明确指定才行。
所以我采用的办法是:采用 CMake 脚本生成 Visual C++ 工程,然后在 Visual C++ 中编译特定版本。
我的编译过程
首先将 cunit-3.3.1.zip 解压到一个目录中。比如在我的电脑上,我将其解压至:D:\Dev\Build\cunit-3.3.1
然后,在控制台(命令行)中:
cd /d D:\Dev\Build\cunit-3.3.1
mkdir local-build
cd local-build
编译 x64 平台的不同编译类型的版本
执行以下 CMake 命令:
cmake -G "Visual Studio 17 2022" -A x64 ..
可以看到在local-build
文件夹中生成了 Visual Studio 的 Solution 文件:CUnit.sln
双击CUnit.sln
打开Visual C++,在 cunit 编译项目的属性中:
- 将 Output Directory 设置为:
$(SolutionDir)Output\LIB\$(Platform)\$(Configuration)\
- 将 Intermediate Directory 设置为:
$(SolutionDir)IntDir\$(ProjectName)\$(Platform)\$(Configuration)\
然后针对各个编译类型进行批量编译:
这样就一次性地编译好了x64
平台下的Debug
、Release
、MinSizeRel
、RelWithDebInfo
这4个编译类型的版本。
在local-build\Output\LIB\x64
文件夹在,可以看到各个编译类型的编译好的文件整整齐齐码在各个子目录中:
这就是前面我们设置 Output Directory 这个属性的结果,看,非常方便 吧。
编译 Win32 平台的不同编译类型的版本
前面针对x64
平台进行了编译,我们将编译好的文件打包存好,然后再次解压 cunit-3.3.1.zip,假设这次我们还解压到D:\Dev\Build\cunit-3.3.1
然后,在控制台(命令行)中:
cd /d D:\Dev\Build\cunit-3.3.1
mkdir local-build
cd local-build
执行以下 CMake 命令:
cmake -G "Visual Studio 17 2022" -A Win32 ..
双击CUnit.sln
打开Visual C++,在 cunit 编译项目的属性中:
- 将 Output Directory 设置为:
$(SolutionDir)Output\LIB\$(Platform)\$(Configuration)\
- 将 Intermediate Directory 设置为:
$(SolutionDir)IntDir\$(ProjectName)\$(Platform)\$(Configuration)\
同样批量编译得到Win32
平台下的Debug
、Release
、MinSizeRel
、RelWithDebInfo
这4个编译类型的版本。