一些第三方库的构建与集成记录
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 |
|
直接集成的话 Core 文件会错误地被忽略。
OpenCV
https://github.com/opencv/opencv
下载依赖
万恶的 GFW
-
最无脑的解决方案,通过配置
-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 的组合是没什么问题的。 -
开启代理并配置环境变量
Downloaded dependencies
配置
-
静态 / 动态:
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 会生成 glew
和 glew_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_EXTERNAL
或 SPDLOG_FMT_EXTERNAL_HO
宏,手动更新 fmt。
spdlog 使用 find_package
查找 fmt,我们需要先生成 fmt,得到 fmt-config.cmake
文件,然后将其所在路径添加至 CMAKE_PREFIX_PATH
或 fmt_DIR
,两者都可以用 -D 指令添加。
项目中要包含 fmt 的头文件,记得不要把 spdlog bundled 的 fmt 文件包含进项目。
在项目内还要手动定义 SPDLOG_FMT_EXTERNAL
和 SPDLOG_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
SDL
动态库
官方推荐编译为动态库,实际上编译为静态库时需要手动链接几个依赖库,具体可以查看 CMake log。
SDL_config.h
SDL 会在 build 目录下生成不同配置的 SDL_config.h,我们需要在工程里包含这个路径:\build\include-config-release\SDL2\SDL_config.h
Assimp
配置
- 静态 / 动态:
BUILD_SHARED_LIBS
- 运行时库:
USE_STATIC_CRT
config.h
assimp 会在 build 目录下生成 config.h,我们需要在工程里包含这个路径:\build\include\assimp\config.h
zlib
还需要手动链接 zlib,这个库会被默认编译至 \build\contrib\zlib