准备工作

源代码获取

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. dotnet C# 反射扫描程序集所有类型会不会触发类型静态构造函数

    在 dotnet 里面,有很多框架都喜欢扫描程序集进行初始化逻辑,在扫描程序集的所有类型的时候,相当于碰到所有类型.而某个类型的静态构造函数将会在某个类型被使用之前被 CLR 调用,那么扫描类型是否会 ...

  2. ffmpeg7.0常用命令笔记 windows下

    1.多媒体格式转换 ffmpeg -i input.mov -acodec copy -vcodec copy out.mp4 2.从多媒体文件中抽取音频 ffmpeg -i input.mov -v ...

  3. .NET有哪些好用的定时任务调度框架

    前言 定时任务调度的相关业务在日常工作开发中是一个十分常见的需求,经常有小伙伴们在技术群提问:有什么好用的定时任务调度框架推荐的?今天大姚给大家分享5个.NET开源.简单.易用.免费的任务调度框架,帮 ...

  4. NASM中的伪指令

    伪指令不是真正的指令,而是为了方便NASM汇编器而存在,但是它们的地位与真正的指令相同: label: instruction operands ; comment instruction部分就可以是 ...

  5. fastposter v2.8.3 发布 电商海报生成器

    fastposter v2.8.3 发布 电商海报生成器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.贰维海报,图片海报,分享海报贰维码推 ...

  6. vue3语法糖script setup

    在vue3种setup的写法,可以单独写setup()也可以写到script标签中,当然我们推荐后面这种 他的好处有很多,代码也简洁很多. 1.属性和方法无需return,可直接使用 /*原先*/ & ...

  7. d3d12龙书阅读----绘制几何体(下)

    d3d12龙书阅读----绘制几何体(下) 本节在上一节的基础上,对整个绘制过程进行优化,将绘制单个几何体的内容拓展到了多个几何体,同时对根签名进行了进一步地探索. 帧资源 在之前绘制每帧的结尾,我们 ...

  8. Seata原理浅析

    前言 Seata是阿里开源的分布式事务解决方案,本文将详细介绍 Seata 的事务模式.原理以及使用.了解之前需清楚什么是分布式事务. 一.什么是 Seata Seata 是一款开源的分布式事务解决方 ...

  9. 万事通,专精部分领域的多功能 Transformer 智能体

    介绍 我们很高兴分享"万事通"(Jack of All Trades,简称 JAT) 项目,该项目旨在朝着通用智能体的方向发展.该项目最初是作为对 Gato (Reed 等,202 ...

  10. 微信小程序预约视频号直播

    一.概述 微信小程序提供了可以唤起预约视频号直播弹窗的接口 reserveChannelsLive,该接口接收一个参数 noticeId,通过 getChannelsLiveNoticeInfo 接口 ...