Windows 编译 yangfengzzz/fluid-engine-OpenVDB

news2025/7/16 22:37:43

我想将 OpenVDB 接入 doyubkim 的流体引擎

https://github.com/doyubkim/fluid-engine-dev

然后搜到已经有人做过这件事了

https://github.com/yangfengzzz/fluid-engine-OpenVDB

Windows 编译 yangfengzzz/fluid-engine-OpenVDB

但是我是 windows,所以想要编译他这个库还要费一点精力

cmake

首先是,要使用 vcpkg 和 cmake 搭配,要注意配置 DCMAKE_TOOLCHAIN_FILE

@echo off

cls

REM Configure a release build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake

REM Actually build the binaries
cmake --build build/ --parallel 4

pause

然后这个仓库的 FindTBB.cmake 似乎有点问题,我就直接从 openvdb 的 cmake 文件夹里面复制所有的 FindXXX.cmake 过来了

他设置 CMAKE_MODULE_PATH 的方式似乎有点问题,直接追加 "../cmake" 的话,似乎不会转换为完整的路径。所以我就把这些都注释掉了

# list(APPEND CMAKE_MODULE_PATH "../cmake")

然后在最外层的 CMakeLists 设置 CMAKE_MODULE_PATH

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

第三方库可以找到了之后,然后是一些错误

attribute

  log_manager.cpp
  marching_cubes.cpp
E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,26): error C2059: syntax error: '(' [E:\repositor
ies\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxproj]
  (compiling source file '../../src.common/log_manager.cpp')

E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,36): error C4430: missing type specifier - int as
sumed. Note: C++ does not support default-int [E:\repositories\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxpro
j]
  (compiling source file '../../src.common/log_manager.cpp')

E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,36): error C2059: syntax error: ')' [E:\repositor
ies\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxproj]
  (compiling source file '../../src.common/log_manager.cpp')

E:\repositories\fluid-engine-OpenVDB\src.common\log_manager.cpp(81,9): error C2352: 'vox::ExceptionFactory::throwExcept
ion': a call of a non-static member function requires an object [E:\repositories\fluid-engine-OpenVDB\build\src.common\
Flex_Common.vcxproj]
  E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,43):
  see declaration of 'vox::ExceptionFactory::throwException'

E:\repositories\fluid-engine-OpenVDB\src.common\log_manager.cpp(118,9): error C2352: 'vox::ExceptionFactory::throwExcep
tion': a call of a non-static member function requires an object [E:\repositories\fluid-engine-OpenVDB\build\src.common
\Flex_Common.vcxproj]
  E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,43):
  see declaration of 'vox::ExceptionFactory::throwException'

  parallel.cpp
E:\repositories\fluid-engine-OpenVDB\src.common\parallel.cpp(14,11): error C1083: Cannot open include file: 'tbb/task_s
cheduler_init.h': No such file or directory [E:\repositories\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxproj]

  vox_exception.cpp
E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,26): error C2059: syntax error: '(' [E:\repositor
ies\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxproj]
  (compiling source file '../../src.common/vox_exception.cpp')

E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,36): error C4430: missing type specifier - int as
sumed. Note: C++ does not support default-int [E:\repositories\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxpro
j]
  (compiling source file '../../src.common/vox_exception.cpp')

E:\repositories\fluid-engine-OpenVDB\src.common\vox_exception.hpp(241,36): error C2059: syntax error: ')' [E:\repositor
ies\fluid-engine-OpenVDB\build\src.common\Flex_Common.vcxproj]
  (compiling source file '../../src.common/vox_exception.cpp')

__attribute__ 的问题,这个写法是 gcc 的,msvc 识别不了

修改为 [[]] 的形式就好了

后面知道属性只能用在定义

error C3829: attribute [[noreturn]] may only be applied to a function declaration

我就干脆把这个属性删了,不想再拆开了

tbb

然后是找不到 tbb 的头文件

看了一下才发现他没有在 CMakeLists 中包含 TBB 的头文件目录

不知道他是怎么编译通过的……

于是我给他两个目标加上了

target_include_directories(Flex_Common PUBLIC ${TBB_INCLUDE_DIRS})
target_include_directories(Flex_VDB PUBLIC ${TBB_INCLUDE_DIRS})

但是从 openvdb 复制过来的 FindTBB.cmake 里面设置的是 Tbb_INCLUDE_DIRS,有点怪

我就从 doyubkim 复制 FindTBB.cmake 过来,结果这个还找不到 tbb 包

于是还是只能用 openvdb 的 FindTBB.cmake

target_include_directories(Flex_Common PUBLIC ${Tbb_INCLUDE_DIRS})
target_include_directories(Flex_VDB PUBLIC ${Tbb_INCLUDE_DIRS})

但是仍然报错说找不到 include 目录

不知道为什么,他把这个 include path 加到了 C/C++ - All Options - Additional Options 里面了,看上去像是命令行参数一样

在这里插入图片描述

之后我才发现,似乎我的 target_include_directories 没有产生效果

但是命令行里面有这个 /external:I "E:/vcpkg/installed/x64-windows/include" 似乎也是一样的

我不知道是哪个东西引出了 /external:I "E:/vcpkg/installed/x64-windows/include",应该是配置 DCMAKE_TOOLCHAIN_FILE 导致的吧

所以这似乎不是 VS 的问题,我看了我 vcpkg 下载的 tbb,还真的没有 task_scheduler_init.h 这个文件

所以这就是 tbb 的版本问题了

搜了一下,确实是 2021 版本的 tbb 删掉了这个头文件

搜到了怎么用 vcpkg 控制版本

https://devblogs.microsoft.com/cppblog/take-control-of-your-vcpkg-dependencies-with-versioning-support/

https://learn.microsoft.com/en-us/vcpkg/consume/lock-package-versions?tabs=inspect-powershell

根据它的说法,我首先在项目根目录创建了一个 vcpkg.json

{
    "dependencies": [
        "tbb",
        "glog",
        "openvdb"
    ],
    "builtin-baseline": "3f6e8e9c09e28a0eae4b37cceb2982ca2518278c",
    "overrides": [
        {
            "name": "tbb",
            "version": "2020.02.0"
        }
    ]
}

然后我直接调用 cmake 构建,vcpkg 对我这个设置的版本没有反应

我已经安装的 tbb 是 2021.10 的,我直接用 cmake 构建,tbb 的版本并没有变化

我把 tbb 和 openvdb 卸载了,然后我再

之后我看到教程里面说,版本控制暂时不适用于通过命令行安装的包

我才知道,原来可以有不通过命令行安装的方法……?

于是我重新看了一下,发现他有一个带有 version 标志的命令行

vcpkg --feature-flags="versions" install

运行了这个命令之后,提示说我这个版本号不正确,并且给出了一些正确的版本号

于是我把 json 改成了

{
    "dependencies": [
        "tbb",
        "glog",
        "openvdb"
    ],
    "builtin-baseline": "3f6e8e9c09e28a0eae4b37cceb2982ca2518278c",
    "overrides": [
        {
            "name": "tbb",
            "version-string": "2020_U3#8"
        }
    ]
}

现在 vcpkg 确实能够识别到我设定的这个版本,但是直接运行 cmake 还是找不到

现在他似乎把东西都下载到了 vcpkg_installed 这个文件夹里面了

比如我现在关心的这个 tbb,在我 vcpkg 的安装目录里面没找到 tbb,但是在工程目录的 vcpkg_installed 里面有

现在一个明显的问题是,我该怎么让 cmake 知道他要找工程目录的这个 vcpkg_installed 文件夹里面?

之后查到,用版本控制的这个方法属于清单模式

确实已经有使用清单模式构建的教程

https://learn.microsoft.com/en-us/vcpkg/consume/manifest-mode?tabs=cmake%2Cbuild-cmake

似乎他也没做什么

但是为什么我这里就找不到包呢,之后我删了 build 重新构建,似乎就行了

所以就是要清理构建缓存的事

uint

然后是 uint 不识别的问题,这不是一个标准的写法,直接替换成 unsigned int

连接不到 Flex_Common.lib

Flex_Common 是作为共享库来生成的,现在 cmake 需要它的 lib 文件,但是实际上没有生成

LINK : fatal error LNK1104: cannot open file '..\src.common\Debug\Flex_Common.lib' [E:\repositories\fluid-engine-OpenVDB\build\src.vdb\Flex_VDB.vcxproj]

查了一下,是因为实际上这个库没有导出符号

可以设置强制导出所有符号,来获得 lib 文件

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

但是实际上这就是代码结构的问题,为什么你没有用到共享库中的导出函数?

我查了一下,这里面的代码都没有用到 dllexport

所以我就直接改成了 STATIC

这样,终于能够正常编译了

Flex_Common Flex_VDB 两个库都改成 STATIC

单元测试

然后就是编译单元测试和人工测试

他是在代码里面 hardcode 了一个外部的路径,然后 CMakeLists 里面也是 hardcode 的外部路径

所以我把 ../external/gtest/include/gtest 替换成 gtest,把 ../external/gmock/include/gmock 替换成 gmock

然后在 vcpkg.json 里面添加这两个库

在 CMakeLists 里面添加

find_package(GTest)

CMakeLists 中把 gtest gmock 换成 GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main

然后是 Eigen3,删了源文件里面的 ../external/,CMakeLists 里面加上相关的

cg pcg 没有匹配的模板

之前把 uint 改成了 unsigned int,之后发现很多到 size_t 的类型转换的警告,所以又改成了 size_t

但是我只是在 src 里面把 unsigned int 改成 size_t,没有在单元测试里面改

才导致了这个错误

所以我重置了一下代码,只把 uint 换为 unsigned int

就不会有不匹配的情况

M_PI

在 M_PI 报错的那个源文件里面,在所有包括头文件之前定义宏

#define _USE_MATH_DEFINES

之所以在所有 include 之前定义,是为了防止头文件之间互相干扰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1453400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第三二天 | 买卖股票、跳跃游戏

目录 买卖股票的最佳时机II跳跃游戏跳跃游戏ii LeetCode 122.买卖股票的最佳时机II LeetCode 55. 跳跃游戏 LeetCode 45.跳跃游戏II 买卖股票的最佳时机II 只有一只股票! 当前只有买股票或者卖股票的操作。 最终利润是可以分解的:把利润分解为每天为…

【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用&#xff0…

Vue练习1:组件开发1(头像组件)

样式预览 注释代码 <template><div class"img-box":style"{ //动态style必须为对象width: size rem,height: size rem}"><imgclass"avatar-img":src"url" //动态url/></div> </templ…

【ARM架构】ARMv8-A 系统中的安全架构概述

一个安全或可信的操作系统保护着系统中敏感的信息&#xff0c;例如&#xff0c;可以保护用户存储的密码&#xff0c;信用卡等认证信息免受攻击。 安全由以下原则定义&#xff1a; 保密性&#xff1a;保护设备上的敏感信息&#xff0c;防止未经授权的访问。有以下几种方法可以做…

算法详解:滑动窗口-- 最大连续1的个数 III

题目来源:力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 本期讲解滑动窗口经典例题,我会从三个点开始讲解题目1.题目解析2.算法原理 3.编写代码 1.题目解析 这道题目理解起来还是比较简单的,我们简单分析一下,也就是给定一个数组,数组是由1和0组成…

PLC-Recorder的延伸分析功能说明

目录 一、缘起 二、如何从PLC-Recorder获取数据 1、在线获取 2、全自主打开数据文件 3、延伸分析 三、设置方法 四、效果展示 一、缘起 在各个行业&#xff0c;在不同的场景中&#xff0c;朋友们拿到数据后&#xff0c;想做的事情五花八门&#xff0c;有做宏观分析的、…

ABC341 A-G

Toyota Programming Contest 2024#2&#xff08;AtCoder Beginner Contest 341&#xff09; - AtCoder B读不懂题卡了&#xff0c;F读假题卡了&#xff0c;开题开慢了rank了 A - Print 341 题意&#xff1a; 打印一串交替出现的包含N个0&#xff0c;N1个1的01串 代码&…

OpenCV-40 绘制直方图

一、使用matplotlib画直方图 可以利用matplotlib把OpenCV统计得到的直方图绘制出来 示例代码如下&#xff1a; import cv2 import matplotlib.pyplot as pltlena cv2.imread("beautiful women.png") # 变为黑白图片 gray cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY…

视觉设计师的项目评审复盘攻略:如何提升设计质量与效率

视觉设计师的角色是至关重要的&#xff0c;以确保设计项目满足预期的质量和结果。作为一名视觉设计师&#xff0c;有必要进行定期的项目审查&#xff0c;以确保项目在正轨上进行&#xff0c;并尽早解决任何问题。在本文中我们将讨论可视化设计人员如何做好项目评审&#xff0c;…

HarmonyOS—@State装饰器:组件内状态

State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。 在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&a…

永久禁止windows自动更新方法

文章目录 前言一、打开本地组策略编辑器二、禁用windows更新总结 前言 每次打开电脑&#xff0c;右下角就会弹出设备更新提示&#xff0c;看着令人烦恼&#xff0c;并且更新可能导致电脑设置发生改变甚至是卡顿&#xff0c;所以为了自己方便于是出了禁用电脑更新的办法&#x…

「算法」二分查找1:理论细节

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;算法详解 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 二分查找算法简介 这个算法的特点就是&#xff1a;细节多&#xff0c;出错率高&#xff0c;很容易就写成死循环有模板&#xff0c;但…

Day46 300最长递增子序列 674最长连续递增子序列 718最长重复子数组 1143最长公共子序列

300 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序…

CV | Segment Anything论文详解及代码实现

本文主要是详解解释了SAM的论文部分以及代码实现~ 论文&#xff1a;2023.04.05_Segment Anything 论文地址&#xff1a;2304.02643.pdf (arxiv.org) 代码地址&#xff1a;facebookresearch/segment-anything: The repository provides code for running inference with the Seg…

【C语言】长篇详解,字符系列篇1-----“混杂”的各种字符类型字符转换和strlen的模拟实现【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】长篇详解&#xff0c;字符系列篇1-----“混杂”的各种字符函数……&#xff0c;图文讲解各种字符函数&#xff0c;带大家更深刻理解C语言中各种字符函数的应用&#xff0c;感谢观看&#xff0c;支持的可以给个赞哇。 前言…

SpringCloud-Nacos集群搭建

本文详细介绍了如何在SpringCloud环境中搭建Nacos集群&#xff0c;为读者提供了一份清晰而详尽的指南。通过逐步演示每个关键步骤&#xff0c;包括安装、配置以及Nginx的负载均衡设置&#xff0c;读者能够轻松理解并操作整个搭建过程。 一、Nacos集群示意图 Nacos&#xff0…

ClickHouse--12-可视化工具操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 可视化工具操作1 tabixhttp://ui.tabix.io/ 2 DBeaverhttps://dbeaver.io/download/ 可视化工具操作 1 tabix tabix 支持通过浏览器直接连接 ClickHouse&#xff…

2023年程序员观察报告

春节假期已过&#xff0c;2023年悄然过去&#xff0c;2024年已经到来&#xff0c;无论2023年是快乐的、成长的、积极的&#xff0c;亦或是痛苦的、寂寥的、迷茫的&#xff0c;都要恭喜在座的各位程序员又熬过了一年&#xff01; ①加班篇 2023年&#xff0c;你完成了 132个需求…

【DDD】学习笔记-聚合之间的关系

聚合之间的关系 无论聚合是否表达了领域概念的完整性&#xff0c;我们都要清醒地认识到这种所谓的“完整”必然是相对的。如果说在领域分析模型中&#xff0c;每个体现了领域概念的类是模型的最小单元&#xff0c;那么在领域设计模型中&#xff0c;聚合才是模型的最小单元。我…

基于ORB-SLAM2与YOLOv8剔除动态特征点

基于ORB-SLAM2与YOLOv8剔除动态特征点 以下方法以https://cvg.cit.tum.de/data/datasets/rgbd-dataset/download#freiburg3_walking_xyz数据集进行实验测试APE 首先在不剔除动态特征点的情况下进行测试&#xff1a; 方法1:segment坐标点集合逐一排查剔除 利用YOLOv8的segm…