辛亚平的博客专栏

用 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

编译环境

  1. Visual Studio 2022
  2. CMake (版本不应小于 3.5,我实际采用的版本是 3.28.3)

对 CMake 编译脚本的一点修改

cunit-3.3.1.zip 中提供的 CMake 编译脚本CMakeLists.txt有一点小小的问题,如下所示:
image

第 7 行的cmake_minimum_required语句,应该挪到文件最顶行,否则执行这个编译脚本的时候会产生一些错误(警告),修改如下,将第 7 行挪到第 1 行:
image

编译过程

为什么我不完全采用 CMake 编译?

尽管这一份源代码提供了 CMake 脚本,但它的 CMake 脚本不支持采用CMAKE_BUILD_TYPE参数设置DebugRelease编译类型,这一点我非常不喜欢。通常我在编译 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 ..

image

可以看到在local-build文件夹中生成了 Visual Studio 的 Solution 文件:CUnit.sln
image

双击CUnit.sln打开Visual C++,在 cunit 编译项目的属性中:
image

  1. 将 Output Directory 设置为:$(SolutionDir)Output\LIB\$(Platform)\$(Configuration)\
  2. 将 Intermediate Directory 设置为:$(SolutionDir)IntDir\$(ProjectName)\$(Platform)\$(Configuration)\

然后针对各个编译类型进行批量编译:
image

这样就一次性地编译好了x64平台下的DebugReleaseMinSizeRelRelWithDebInfo这4个编译类型的版本。
local-build\Output\LIB\x64文件夹在,可以看到各个编译类型的编译好的文件整整齐齐码在各个子目录中:
image
这就是前面我们设置 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 ..

image
双击CUnit.sln打开Visual C++,在 cunit 编译项目的属性中:

  1. 将 Output Directory 设置为:$(SolutionDir)Output\LIB\$(Platform)\$(Configuration)\
  2. 将 Intermediate Directory 设置为:$(SolutionDir)IntDir\$(ProjectName)\$(Platform)\$(Configuration)\

同样批量编译得到Win32平台下的DebugReleaseMinSizeRelRelWithDebInfo这4个编译类型的版本。

posted on 2024-06-12 22:04  辛亚平  阅读(72)  评论(0编辑  收藏  举报

导航