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 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 之前定义,是为了防止头文件之间互相干扰

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea突然出现错误: “找不到或无法加载主类 @C:\Users\happ“解决方案

在公司敲代码时,编译器突然出现了以下报错,之前一直能正常运行 可以使用以下方法解决 找到启动类相关配置 找到Shorten command line,选择如下配置即可 进行到这里项目就能正常运行了,仅以此贴记录问题解决方案

高程 | 继承与派生(c++)

文章目录 📚继承的概念和语法📚派生类生成过程📚继承权限和继承方式🐇公有继承🐇私有继承🐇保护继承 📚类型转换规则📚派生类构造函数和析构函数📚继承中的静态成员特性&…

互联网加竞赛 基于设深度学习的人脸性别年龄识别系统

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习机器视觉的…

SpringBoot实战:打造企业资产管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

php 数组函数

php 数组函数 1. 常用的php数组函数 1. 常用的php数组函数 array_pop() 删除数组中最后一个元素 array_push() 将一个或多个元素插入到数组的末尾 array_keys <?php $arr array("刘岩" > 30, "范冰冰" > 31, "娜扎" > 31);$…

制作一个入耳式耳机壳需要用到哪些材料和工艺流程呢?

制作一个入耳式耳机壳需要用到以下材料和工艺流程&#xff1a; 材料&#xff1a; 耳机壳材料&#xff1a;常用的有PC/ABS塑料、金属、陶瓷、木质等。不同材料具有不同的特性&#xff0c;如塑料轻便耐用、金属质感好、陶瓷高档、木质自然等。耳塞材料&#xff1a;常用的有硅胶、…

自学ESPIDF(一)点个灯

不废话&#xff0c;万物皆从点灯开始。 espidf的examples里有个blink&#xff0c;作为测试再好不过了。 /* Blink ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissof…

模仿 STM32 驱动开发格式实验

1.模仿 STM32 寄存器定义 为了开发方便&#xff0c; ST 官方为 STM32F103 编写了一个叫做 stm32f10x.h 的文件&#xff0c;在这个文件 里面定义了 STM32F103 所有外设寄存器&#xff0c;我们可以使用其定义的寄存器来进行开发&#xff0c;比如我 们可以用如下代码来初始…

【regex】正则表达式

集合 [0-9.] [0-9.\-] 例子 正则表达式&#xff0c;按照规则写&#xff0c;写的时候应该不算困难&#xff0c;但是可读性差 不同语言中regex会有微小的差异 vim 需要转义&#xff0c; perl/python中不需要转义 锚位 \b am\b i am 命名 [0-9.\-] (?<ta>[0-9.\-]) …

机器学习中为什么需要梯度下降

在机器学习中&#xff0c;梯度下降是一种常用的优化算法&#xff0c;用于寻找损失函数的最小值。我们可以用一个简单的爬山场景来类比梯度下降的过程。 假设你被困在山上&#xff0c;需要找到一条通往山下的路。由于你是第一次来到这座山&#xff0c;对地形不熟悉&#xff0c;你…

微服务学习Day4

文章目录 初始MQ同步通讯和异步通讯MQ常见技术介绍 RabbitMQ快速入门入门案例 SpringAMQP介绍例子WorkQueue模型exchange交换机消息转换器 初始MQ 同步通讯和异步通讯 MQ常见技术介绍 RabbitMQ快速入门 入门案例 SpringAMQP 介绍 例子 WorkQueue模型 exchange交换机 消息转换…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传&#xff0c;请敬请期待 很多⼈在处理分类变量时都会遇到很多困难&#xff0c;因此这值得⽤整整⼀章的篇幅来讨论。在本章中&#xff0c;我将 讲述不同…

分享几种免费获取SSL证书方式

自2018年七月开始&#xff0c;Chrome将所有未安装使用SSL证书的网站皆标记为“不安全”。在访问未安装部署SSL证书网站时经常会出现风险提示&#xff0c;而拥有SSL证书的网站在权重排名上会有一定提升。 当然网站部署SSL证书最主要的意义还是在于网络安全防范和普及https&#…

【IDEA关闭项目一直转圈】

IDEA关闭项目一直转圈&#xff1a; IDEA启动时&#xff0c;会自动打开上次关闭时所有显示的窗口&#xff0c;如果本次工作不需要上次打开的所有窗口&#xff0c;可以基于选择窗口界面的右上角去关闭。 项目关闭失败 但是偶尔会出现窗口关闭时&#xff0c;一直显示“正在关闭项…

Ubuntu学习笔记-禅道从windows迁移到ubuntu中。

文章目录 一、备份Windows下的数据1.1 备份Windows下的mysql数据库数据1.1.1 找到禅道安装目录下的mysql文件路径。1.1.2 执行mysqldump指令备份数据库1.1.3 将数据库备份文件拷贝到ubuntu服务器中。二、ubuntu下配置禅道2.1 ubuntu安装禅道2.1.1 点击禅道下载,然后搜索12.5.3…

前端面试必备八股文——HTMLCSS

HTML src和href的区别 src和href都是用来加载外部资源&#xff0c;区别如下 src当浏览器解析到该元素时&#xff0c;会暂停其他资源的加载和处理&#xff0c;直到该资源加载完成。 它会将资源内容嵌入到当前标签所在的位置&#xff0c;将其指向的资源下载应用到文档内&#…

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …

[嵌入式系统-27]:RT-Thread -14- 操作系统配置:rtconfig.h文件与menuconfig命令

目录 一、rtconfig.h 1.1 概述 1.2 软硬件资源配置 1.3 功能模块选择 1.4 内核配置详解 1.5 调度器配置 1.6 硬件设备驱动配置 1.7 网络配置 1.8 调试配置 二、menuconfig 2.1 概述 2.2 主要功能 三、RT Thread配置 VS Linux配置 一、rtconfig.h 1.1 概述 rtco…

关于虚拟化的一切

茶还是咖啡&#xff1f; Xbox 还是 PlayStation&#xff1f; Chrome 还是 Firefox&#xff1f; 我们习惯于做出棘手的选择。在云计算中&#xff0c;选择 Linux 还是 Windows 也不例外&#xff0c;通常涉及成本、灵活性和项目特定要求。虽然 Linux 具有开源和经济高效的优势&…

半理想架构的Doherty功率放大器理论与仿真-基于GAN器件CGH40010F

半理想架构的Doherty功率放大器理论与仿真-基于GAN器件CGH40010F 理想架构的Doherty功率放大器理论与仿真中已经介绍了如何在ADS中使用理想电流源来对DPA的架构进行仿真。但是理想的电流源太理想了&#xff0c;电压、电流的许多行为都是需要自己使用数学公式去严格定义&#x…