Windows 编译 yangfengzzz/fluid-engine-OpenVDB

我想将 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 offclsREM Configure a release build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmakeREM Actually build the binaries
cmake --build build/ --parallel 4pause

然后这个仓库的 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.cppmarching_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.mzph.cn/news/689458.shtml

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

相关文章

MySQL系列之索引入门(下)

前言 通过上文,我想各位盆友已熟悉MySQL的索引分类及其含义,那么如何合理的使用呢? 请继续围观此文,一探究竟! 一、创建索引 首先,我们一起学习索引是如何创建的,又有哪些方式。 1. create t…

VO、DTO、DO、BO、PO

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 VO、DTO、DO、BO1.概念阿里Java开发手册分层领域模型: 2. VO 和 DTO 使用场景以下是一个使用VO和DTO的典型案例: 3.BO和DTO的区别 案例 VO、…

数据结构1.0(基础)

近java的介绍, 文章目录 第一章、数据结构1、数据结构 ?2、常用的数据结构数据结构? 逻辑结构and物理结构 第二章、数据结构基本介绍2.1、数组(Array)2.2、堆栈(Stack)2.3、队列(Que…

宝塔安装MySQL、设置MySQL密码、设置navicat连接

1、登录宝塔面板进行安装 2、设置MySQL连接密码 3、安装好了设置navicat连接 登录MySQL [roothecs-394544 ~]# mysql -uroot -p Enter password: 切换到MySQL数据 mysql> use mysql Database changed mysql> 查询用户信息 mysql> select host,user from user; ---…

数据脱敏(四)脱敏算法-替换算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "替换脱敏"是一种数据处理技术,主要用于保护个人隐私和数据安全。它通过将敏感信息(如姓名、身份证号、电话号码等)替换为无意义或随机的字符&#xf…

完整的 vue-router 导航解析流程

在Vue.js中,vue-router是一个官方提供的路由管理器,它能够帮助我们实现页面之间的无缝切换和导航。 本文将深入探讨vue-router的导航解析流程,并通过示例代码演示如何使用vue-router实现完整的导航过程。 首先,让我们来了解一下…

Linux环境安装Maven(详细图文)

目录 摘要 一、准备工作 1.检查当前环境是否安装maven 2.下载maven ​3.上传maven压缩包 4.解压maven包 5.移动到/usr/local目录下方便管理 6.配置maven环境变量 7.刷新配置文件 8.配置maven镜像仓库 9.验证是否成功 摘要 笔者Linux环境为:Ubuntu 22.04 …

解决Webstorm2023使用账号连接GitLab的问题personal access token instead of a password

问题 升级Webstorm之后,发现gitlab仓库拉取代码报错 报错信息 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https…

【论文精读】BERT

摘要 以往的预训练语言表示应用于下游任务时的策略有基于特征和微调两种。其中基于特征的方法如ELMo使用基于上下文的预训练词嵌入拼接特定于任务的架构;基于微调的方法如GPT使用未标记的文本进行预训练,并针对有监督的下游任务进行微调。 但上述两种策略…

kettle中JavaScript使用例子

1.将输入日期减一后,得到对应格式的输出 输入为20240216则Alert输出20240215 日期减一。 对应函数参考: https://blog.csdn.net/doasmaster/article/details/112978529

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support

直接安装,只支持CPU。想支持GPU,麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件: gitpythoncmakeVisual Studio Community (make sure you install t…

day03-股票数据报表与导出

day03-股票数据表报与导出 目标 理解涨幅榜业务需求;理解涨停跌停概念,并涨停跌停基本实现;理解涨停跌停SQL分析流程,并根据接口文档自定义实现;理解echarts基本使用;掌握easyExcel基本使用,并实现涨幅榜数据导出功能; 第一章 股票涨幅统计 1、涨幅榜…

【spring】@Transactional 注解失效的原因及解决办法

文章目录 前言一、Transactional 属性介绍1.事务的传播行为:propagation2.事务的隔离级别:isolation3.事务的超时时间:timeout4.事务的回滚类型:rollbackFor 二、Transactional 失效场景1.同一个类中方法调用,注解失效…

Visual Studio+C#实现信道与信息率失真函数

1. 要求 设计一款信道与信息率失真函数计算系统,要求如下: 系统能够通过输入的转移概率矩阵计算对称以及非对称离散无记忆信道的信道容量系统能够通过输入的概率分布以及失真矩阵来计算与信息率失真函数有关的相关参数,例如Dmin&#xff0c…

分布式学习笔记

1. CAP理论 Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致。 Availability(可用性):用户访问集群中的任意健康节点,必须得到相应,而不是超时…

vue3-渲染机制

渲染机制 Vue 是如何将一份模板转换为真实的 DOM 节点的,又是如何高效地更新这些节点的呢?我们接下来就将尝试通过深入研究 Vue 的内部渲染机制来解释这些问题。 虚拟 DOM 你可能已经听说过“虚拟 DOM”的概念了,Vue 的渲染系统正是基于这…

基于Java SSM框架实现精准扶贫管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现精准扶贫管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了用户的需…

一文了解Web3.0真实社交先驱ERA

Web2时代,少数科技巨头垄断了全球近60亿人口的网络社交数据,并用之为自己牟利,用户无法掌控个人数据,打破该局面逐渐成为共识,于是,不少人看到了Web3社交赛道蕴含的巨大机遇,标榜着去中心化和抗…

【STM32】硬件SPI读写W25Q64芯片

目录 基础知识回顾: SPI外设简介 SPI框图 主模式全双工连续传输 非连续传输 初始化SPI外设 核心代码 - 交换一个字节 硬件接线图 Code 程序配置过程 MySPI.c MySPI.h W25Q64.c W25Q64.h W25Q64_Ins.h main.c 基础知识回顾: 【STM32】SP…

php实现讯飞星火大模型3.5

前期准备 vscode下载安装好 composer下载安装好 php环境安装好 (以上可以自行网上查阅资料) 开始实现 1.注册讯飞星火用户,获取token使用 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 2.修改对应php文件中的key等 可以参考…