一些第三方库的构建与集成记录

Eigen

纯头文件库,包含路径即可。
https://eigen.tuxfamily.org/index.php?title=Main_Page
GitLab:
https://gitlab.com/libeigen/eigen
GitHub:
https://github.com/PX4/eigen

.gitignore

3.4.0 release 的 .gitignore 相比 GitLab 最新的主分支少两行:

1
2
!Eigen/Core
!Eigen/src/Core

直接集成的话 Core 文件会错误地被忽略。

OpenCV

https://github.com/opencv/opencv

下载依赖

万恶的 GFW

  1. 最无脑的解决方案,通过配置
    -DOPENCV_DOWNLOAD_MIRROR_ID=gitcode
    将下载源改为 GitCode,一个国内代码托管网站。比较依赖于 OpenCV 中国团队和 GitCode 对镜像仓库的维护。下载不再卡顿,OpenCV 中国镜像启用
    ps:
    他们说从 https://gitcode.net/opencv/opencv 下载的代码是不用这条配置的,但是我尝试 clone 下来后看到了 Package ADE from mirror gitcode.net is outdated and will be downloaded from github.com instead. 的警告。提了 Issue 也没反应。
    然后 GitCode 上的 Release 实际上又是需要这条配置的(意思是 GitCode Release 和 GitHub Release 是一模一样的,而且下载源都是外网。)
    总之有点抽象,好在 GitHub Latest Release + -DOPENCV_DOWNLOAD_MIRROR_ID=gitcode 的组合是没什么问题的。

  2. 开启代理并配置环境变量
    Downloaded dependencies

  3. 手动下载依赖
    Visual Studio + OpenCV + OpenCV_contrib 源代码编译流程

配置

DOC

  • 静态 / 动态:BUILD_SHARED_LIBS

  • 运行时库:BUILD_WITH_STATIC_CRT

  • 只生单个库文件:BUILD_opencv_world

fswatch

https://github.com/emcrisostomo/fswatch
一个使用 GCC 编译的跨平台文件监视器,开发者不太关心 Windows 上的编译体验,深感麻烦。

安装 MinGW

我们需要一个 Windows GCC,自然是先装 MinGW-W64。
比起直接解压 MinGW 再配置环境变量,更方便的是先安装一个 MSYS2。MSYS2 自带一个包管理器 packman,可以很方便的下载 MinGW 以及更多乱七八糟的依赖。以 Windows MSYS2 MinGW GCC 为关键词搜索应该就能找到不错的教程。

配置 CMake 生成器

在指定生成器的阶段我们需要选择 MinGW Makefiles + Specify native compilers,然后将 C 与 C++ 的编译器配置为 MSYS2 安装的 gcc.exe 与 g++.exe 路径。

指定生成器
指定本地编译器

路径大概是 C:/msys64/mingw64/bin 之类的。

配置 CMake 依赖

Makefile 生成依赖于 MSGFMT,MSGMERGE 与 PTHREAD,前两个都属于 Gettext。
如果看到任何 NOTFOUND 字眼,用 MSYS2 搜索并安装对应的库,然后配置对应路径。

编译

回到根目录执行 cmake --build build,出现如下报错:
error: 'realpath' was not declared in this scope
error: 'lstat' was not declared in this scope; did you mean 'wstat'?
结果这似乎是一个遗留 bug,七年没修:
https://github.com/emcrisostomo/fswatch/issues/121
最终是放弃了这个库的集成转而使用了 dmon

参考资料

给萌新的 C/C++ 环境搭建攻略(VSCode 和 MSYS2)
捋一捋 gcc / g++ / MingW / MSVC 与 make / CMake 的关系
[科普][FAQ] MinGW vs MinGW-W64 及其它

GLEW

https://glew.sourceforge.net/index.html
OpenGL 扩展库。

静态 / 动态

CMake 会生成 glewglew_s 两个项目,分别对应了动态与静态的生成目标。
然后使用静态库时,要在包含 GLEW 头文件之前定义 GLEW_STATIC 这个宏,写在项目配置里比较好。

.gitignore

要注意一下 glew 仓库里就有一个 build 文件夹,CMakeLists 也在里面,总觉得不太合理,你叫个什么 builds 都比这好。
如果你的仓库忽略了所有叫做 build 的文件夹的,小心这个文件夹也被忽略掉。

spdlog

https://github.com/gabime/spdlog
支持纯头文件 / 编译两种方式。

fmt

最近 MSVC 将 stdext::checked_array_iterator 标记为了已弃用,fmt 用到了这个函数,而 spdlog 默认用到了 fmt。这里有几个解决方案:

1. 屏蔽这个警告

为项目设置 _SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING 宏。

2. 将 spdlog 更新至 v2.x

fmt 已经修复了这个 bug,但 spdlog 作者说为了向后兼容,spdlog v1.x 无法更新 fmt。
v2.x 似乎仍在开发中。

3. 为 spdlog 指定外部的 fmt

开启 SPDLOG_FMT_EXTERNALSPDLOG_FMT_EXTERNAL_HO 宏,手动更新 fmt。
spdlog 使用 find_package 查找 fmt,我们需要先生成 fmt,得到 fmt-config.cmake 文件,然后将其所在路径添加至 CMAKE_PREFIX_PATHfmt_DIR,两者都可以用 -D 指令添加。
项目中要包含 fmt 的头文件,记得不要把 spdlog bundled 的 fmt 文件包含进项目。
在项目内还要手动定义 SPDLOG_FMT_EXTERNALSPDLOG_COMPILED_LIB 两个宏。
如果编译 spdlog 时用的是 SPDLOG_FMT_EXTERNAL_HO,项目中要定义 FMT_HEADER_ONLY 宏。

4. 使用 std::format 代替 fmt

开启 SPDLOG_USE_STD_FORMAT 宏即可。

配置

SPDLOG_NO_EXCEPTIONS

yaml-cpp

https://github.com/jbeder/yaml-cpp
YAML 解析库

配置

  • 运行时库:YAML_MSVC_SHARED_RT
  • 静态库需要的宏定义 YAML_CPP_STATIC_DEFINE

shaderc

集成了 glslang, SPIRV-Tools 和一些其他小功能。
https://github.com/google/shaderc

版本

没有 Release,但是有 Tag,commit message 也有写 Finalize Shaderc v2024.2 之类的。

下载依赖

执行 python 脚本下载依赖 /utils/git-sync-deps

配置

  • 静态 / 动态:BUILD_SHARED_LIBS
  • 运行时库:SHADERC_ENABLE_SHARED_CRT

链接

包含了所有功能的静态库 build/libshaderc/libshaderc_combined.lib

SPIRV-Cross

SPIRV 反编译库
https://github.com/KhronosGroup/SPIRV-Cross

版本

没有 Release,只有 Tag

配置

  • 静态 / 动态:SPIRV_CROSS_SHARED, SPIRV_CROSS_STATIC
  • 运行时库:没有 Cmake 配置,只能改 CMakeLists

链接

spirv-cross-core, spirv-cross-glsl, spirv-cross-hlsl, spirv-cross-msl