准备工作

源代码获取

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有一点小小的问题,如下所示:

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

编译过程

为什么我不完全采用 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 ..

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

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

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

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

这样就一次性地编译好了x64平台下的DebugReleaseMinSizeRelRelWithDebInfo这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 编译项目的属性中:

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

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

用 Visual C++ 2022 和 CMake 编译 CUnit 静态库的更多相关文章

  1. 使用CMake编译跨平台静态库

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译:   . / con ...

  2. Cmake编译成静态库

    To build OpenCV as static library you need to set BUILD_SHARED_LIBS flag to false/off: cmake -DBUILD ...

  3. C++开发新版本vs使用旧版本vs编译的静态库动态库

    关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成 ...

  4. opencv+ linux + cmake 生成 opencv静态库

    您可以省去如下步骤,直接下载我编译好的: http://download.csdn.net/detail/u011258240/9710331 一.编译opencv2.4  不带contrib 1. ...

  5. vs2015编译zlib静态库步骤

    ZLIB静态库的编译 下载ZLIB源码 ZLib官网下载或者GitHub上直接 clone 下来即可 www.zlib.net 截至目前最新版本1.2.1.1本 如下图我选择从官网下载 下载完以后解压 ...

  6. dlib编译成静态库及被其它程序调用

    一.git下载:https://github.com/davisking/dlib 官网:http://dlib.net/ 二.vs中编译成静态库 1.在vs2015中创建静态库工程(vs2015以上 ...

  7. 【转】iOS编译OpenSSL静态库(使用脚本自动编译)

    原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...

  8. 编译skia静态库时,图片解码库无法注册的问题

    转载:http://www.cnblogs.com/imlucky/archive/2012/08/01/2617851.html 今天编译skia库,增加图片解码库时总是无效.按照此博客的方法修改后 ...

  9. 为iOS编译FFmpeg静态库

    为iOS编译FFmpeg静态库 
 环境:OS X Yosemite (版本10.10.5) Xcode (Version 7.1.1 (7B1005)) 
 
 一.资料准备: (1)ffmpeg源 ...

  10. (转)HelloWorld CMake CMake中构建静态库与动态库及其使用

    继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...

随机推荐

  1. [Go] 获得一个整数范围区间的随机数 (golang)

    示例:0,1 随机 package main import "fmt" import "math/rand" import "time" f ...

  2. [Go] CORS 支持多个 origin 访问的思路 (Access-Control-Allow-Origin 部分)

    以下为局部伪代码,仅供参考: var allowOrigin string allowOrigins := config.AppConf.Get("middleware.cors.allow ...

  3. 11.Node节点维护

    题目:Node节点维护 配置环境kubectl config use-context ek8s 将名为ek8s-node-0的node节点设置为不可用,并重新调度该node上所有运行的pods. 官方 ...

  4. Python多线程编程深度探索:从入门到实战

    title: Python多线程编程深度探索:从入门到实战 date: 2024/4/28 18:57:17 updated: 2024/4/28 18:57:17 categories: 后端开发 ...

  5. Codeforces Round #922 (Div. 2) ABCD

    A. Brick Wall 很直白的贪心,显然就是全放横着的砖最优,每行中最多能放 \(\lfloor \dfrac{m}{2} \rfloor\) 个,答案为 \(n \cdot \lfloor \ ...

  6. Swift Charts 报错:Initializer ... requires that .. conform to ‘Identifiable‘

    目录 1. 问题描述 2. 解决办法 1. 问题描述 在运行Swift Charts官方折线图示例时,出现了如下错误. Initializer 'init(_:content:)' requires ...

  7. linux下的开机启动

    使用systemctl命令,systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 据说在CentOS7.0后,不再使用service, ...

  8. 使用 Splashtop 启用员工远程访问

    使员工进行远程工作似乎是一项耗时.不安全且昂贵的任务.但是,借助 Splashtop,您可以快速.轻松.安全地使您的员工从任何位置以最高 价值远程访问其工作站. ​ 如何使用 Splashtop 启用 ...

  9. web3.js:使用eth包

    原文在这里 简介 web3-eth包提供了一套强大的功能,可以与以太坊区块链和智能合约进行交互.在本教程中,我们将指导您如何使用web3.js版本4的web3-eth包的基础知识.我们将在整个示例中使 ...

  10. 4G EPS 中的小区选择

    目录 文章目录 目录 前文列表 小区选择 RSRP(参考信号接收功率) RSRQ(参考信号接收质量) RSSI(接收信号强度指示) SINR(信号与干扰加噪声比) 前文列表 <4G EPS 中的 ...