用 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个编译类型的版本。
用 Visual C++ 2022 和 CMake 编译 CUnit 静态库的更多相关文章
- 使用CMake编译跨平台静态库
在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: . / con ...
- Cmake编译成静态库
To build OpenCV as static library you need to set BUILD_SHARED_LIBS flag to false/off: cmake -DBUILD ...
- C++开发新版本vs使用旧版本vs编译的静态库动态库
关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成 ...
- opencv+ linux + cmake 生成 opencv静态库
您可以省去如下步骤,直接下载我编译好的: http://download.csdn.net/detail/u011258240/9710331 一.编译opencv2.4 不带contrib 1. ...
- vs2015编译zlib静态库步骤
ZLIB静态库的编译 下载ZLIB源码 ZLib官网下载或者GitHub上直接 clone 下来即可 www.zlib.net 截至目前最新版本1.2.1.1本 如下图我选择从官网下载 下载完以后解压 ...
- dlib编译成静态库及被其它程序调用
一.git下载:https://github.com/davisking/dlib 官网:http://dlib.net/ 二.vs中编译成静态库 1.在vs2015中创建静态库工程(vs2015以上 ...
- 【转】iOS编译OpenSSL静态库(使用脚本自动编译)
原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...
- 编译skia静态库时,图片解码库无法注册的问题
转载:http://www.cnblogs.com/imlucky/archive/2012/08/01/2617851.html 今天编译skia库,增加图片解码库时总是无效.按照此博客的方法修改后 ...
- 为iOS编译FFmpeg静态库
为iOS编译FFmpeg静态库 环境:OS X Yosemite (版本10.10.5) Xcode (Version 7.1.1 (7B1005)) 一.资料准备: (1)ffmpeg源 ...
- (转)HelloWorld CMake CMake中构建静态库与动态库及其使用
继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...
随机推荐
- THUWC2024&NOIWC2024游记
以 NOIWC 考试日为 Day 1 好了. Day -6 到重庆了.去报到,然后直接不去试机走了,这波主打一个自信. Day -5 THUWC Day1,四道传统题. 开 T1,一眼有一个 \(O( ...
- kubernetes 存储流程
PV 与 PVC PVC (PersistentVolumeClaim),命名空间(namespace)级别的资源,由 用户 or StatefulSet 控制器(根据VolumeClaimTempl ...
- 【Oracle】Oracle数据库多实例安装
需求:因为需要从RAC的多实例迁移至单虚拟机的多实例.因此,简要概述一下,如何安装数据库的多实例. 不管是Oracle 11g还是10g的多实例,其基本思路都是一致的. 1.调用dbca 在root账 ...
- juc之ConcurrentHashMap在我工作中的实践
Map是我工作中应用比较多的数据结构之一,主要用来存储一些kv的映射信息,如果是单线程环境下我会优先使用HashMap,但是如果在多线程环境下继续使用HashMap我不确定会不会被我老大打死,为了生命 ...
- DNS(1) -- DNS服务及dns资源类型
目录 1.1 DNS服务概述 1.2 DNS域名结构 1.3 DNS解析原理 1.3.1 DNS查询类型 1.3.2 解析答案 1.4 DNS资源记录类型 1.1 DNS服务概述 DNS(Domain ...
- 『手撕Vue-CLI』处理不同指令
前言 在上一篇『手撕Vue-CLI』添加自定义指令中,已经实现了自定义指令的添加,但是指令还是比较简单的,只是简单的打印一句话,那么在实际运用场景中,可能会有更多的需求,比如可能需要在指令中传递参数, ...
- 【题解】A18537.我心中珍藏的游戏
题目跳转 思路: 题目问最多可以获得的额外伤害,其实就是询问在这些技能中,如何怎样选取一个最优的发动技能顺序使得攻击加成最大.我们可以把每一个技能看作成一个图的顶点,把每一个攻击加成看作图的边,权制为 ...
- uniapp 配置 基座调试指定页面
在用hbuildx时,用自定义基座,调试程序时,有的页面因为基座缺少组件而进不去,这个时候就可以用指定页面的方式,我们只需要把进入页面的入参传进去,这个时候打开页面就是指定要调试的页面了. 就在pag ...
- Android 12(S) ALooper AHandler AMessage(二)
来写个demo试试看到底是ALooper AHandler AMessage是怎么运行的,源文件以及Android.bp如下: // EvenHandler.h #ifndef __MESSAGE_T ...
- C# wpf之控制屏幕显示方向旋转
using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices ...