Linux上编译和安装SOFA23.06
前言
你可以直接使用编译安装好的SOFA版本Installing from all-included binaries (v23.06.00):
如果你想自己编译,可以看我下面写的内容,不过绝大多数是从官网来的,如果和官网有出入,建议还是以官网为准。
在Linux下安装了SOFA23.06(23年的最新版),建议先参考油管的视频熟悉一下流程,虽然它的安装距离23年有点久远了,但是基本上按它的步骤来没什么问题:
How to build SOFA on Linux (xubuntu18.04)
博主使用的是自己编译,后续要自己安装其他插件什么的适配性比较好,安装Linux版本主要使用官网的说明来安装,注意SOFA policy is to support only the latest Ubuntu LTS.(SOFA目前只支持在Ubuntu LTS上安装):
SOFA build on linux
空间足够就把官网文档的所有命令都复制进去安装(下面标注可选的可以不装):
构建工具
编译器
首先安装标准编译工具:
sudo apt install build-essential software-properties-common
gcc
要了解哪些 GCC 版本可用于您的发行版,请运行以下命令:
apt-cache search '^gcc-[0-9.]+$'
然后,使用常用命令安装最新的(以 gcc-11 为例):
sudo apt install gcc-11
Clang
Clang 是 GCC 的替代品。它的编译速度大约快两倍!建议安装 Clang 5 或更高版本。
要了解哪些 Clang 版本可用于您的发行版,请运行以下命令:
apt-cache search '^clang-[0-9.]+$'
然后,使用常用命令安装最新的命令(以 clang-12 为例):
sudo apt install clang-12
CMake:Makefile 生成器
在编译 SOFA 项目之前,需要 CMake 对其进行配置。请注意,SOFA 至少需要 CMake 3.12。
sudo apt install cmake cmake-gui
(可选)ninja-构建系统
Ninja 是 Make 的替代品。它可以更好地处理增量生成。
sudo apt install ninja-build
(可选)CCache:缓存系统
我们建议您使用 ccache。这绝不是强制性的,但如果对 SOFA 进行更改,它将大大缩短编译时间。
sudo apt install ccache
依赖
SOFA 需要一些依赖:
Qt (>= 5.12.0) 【带有Qt Charts 和 Qt WebEngine】
建议使用统一安装程序将 Qt 安装在您的用户目录中。确保启用 Qt Charts 和 Qt WebEngine 组件。
安装的网址链接:
https://download.qt.io/official_releases/online_installers/
OpenGL
sudo apt install libopengl0
boost(>= 1.65.1)
sudo apt install libboost-all-dev
Python 3.8
sudo apt install python3.8-dev
其他组件和包,主要是pip,numpy、scipy和pybind11(这个最好也装上,后面可能有用):
sudo apt-get install python3-distutils \ && curl -L https://bootstrap.pypa.io/pip/get-pip.py --output /tmp/get-pip3.py \ && python3.8 /tmp/get-pip3.py \ && python3.8 -m pip install --upgrade pip \ && python3.8 -m pip install numpy scipy pybind11
其他插件
这里我没有装,要用的时候再装也是可以的:
构建SOFA
官网建议如下建立目录,
sofa/
├── build/
│ ├── master/
│ └── v23.06/
└── src/└── < SOFA sources here >
选择一个位置,在终端输入。
mkdir sofa
cd sofa
mkdir build
mkdir src
cd ..
然后克隆SOFA的23.06的版本:
git clone -b v23.06 https://github.com/sofa-framework/sofa.git sofa/src
使用cmake生成Makefile
在使用cmake前最好检查一下自己的Ubuntu有没有安装stdc++(这是clang++使用的),如果使用的是gcc编译器,应该检查有没有g++。没有可能会报错:
我这里安装的是stdc++:
sudo apt-get install libstdc++-11-dev
- 切换路径到sofa/build下面
cd sofa/build
cmake-gui ../src
-
如果安装了 Ninja,选择“CodeBlocks – Ninja”。否则,选择“CodeBlocks – Unix Makefile”。我这里选择前者。
-
选择“Specify native compilers” ,然后点 “Next”,设置C编译器和C++编译器
Set the C compiler to /usr/bin/gcc
or /usr/bin/clang
Set the C++ compiler to /usr/bin/g++
or /usr/bin/clang++
这里的文件名具体到usr目录下看一下,像我这里选的是/usr/bin/clang-12
和/usr/bin/clang++-12
-
点击configure
-
有什么报错就检查报错的来源修复就行了,一般是没找到依赖的路径,添加进去就行了。可以看看视频的操作:How to build SOFA on Linux (xubuntu18.04)
-
(可选)自定义SOFA 通过CMake变量:
- 可修改
CMAKE_BUILD_TYPE
为“Release” 或 “RelWithDebInfo” (recommended) 或 “Debug” - 激活或不激活插件: PLUGIN_XXX,打勾与不打勾
- 激活或不激活功能: SOFA_XXX,打勾与不打勾
- 没有问题了就点击generate
- 退出cmake-gui,然后再build目录下输入:
ninja
就开始编译了,这里应该是没有什么错误的。
我自己装了一些插件,印象中有两个错误:
- 某文件的某行override删去(没有覆盖的虚函数)
- 某文件调用函数名wblock改成wbloc,不太记得了QAQ.(源代码还有bug,emmm)
如果一切正常,你在build目录下的终端应该输入:
./bin/runSofa
可以看到蛇的画面
至此安装就完成了
(可选)安装
另外可以进行安装,把所有编译好的文件放在一个文件夹里。我这里在build目录下建立一个install的文件夹:
mkdir install
然后在build目录下打开终端输入
cmake -DCMAKE_INSTALL_PREFIX=/home/lsy/sofa/build/install ../src
ninja install
然后你就能在install文件下找到你安装的文件。
加入插件
cmake-gui里已有的插件
需要先进行编译为.so文件,然后才可以添加。
首先在SOFA里是集成了一些插件的,可以直接从github仓库fetch,在build目录下打开终端,输入:
cmake-gui ../src
比如我要安装SofaPython3,找到SOFA_FETCH_SOFAPYTHON3这个变量打勾(我这里的图片就不展示打勾了)
然后就能看到出现了PLUGIN_SOFAPYTHON3的变量,打勾
点击configure,没有报错就generate,然后关闭cmake-gui。在终端输入ninja
重新编译。
cmake-gui里没有的插件
如果需要安装cmake-gui里没有的插件,比如STLIB这个插件,就需要自己在cmake里添加了,参见官网说明:Build a plugin
另外油管还有个视频演示了怎么加入插件:Compile external plugins with SOFA on Linux (xubuntu18.04)
官网建议按下面的目录格式创建文件夹管理插件
ext_plugin_repo/
├── plugin1/
├── plugin2/
└── ...
在sofa的目录下输入:
mkdir ext_plugin_repo
cd ext_plugin_repo
我这里选择的是in-tree的编译,在ext_plugin_repo目录下新建一个CMakeLists.txt
touch CMakeLists.txt
然后在这个目录下克隆仓库,比如
git clone https://github.com/SofaDefrost/STLIB.git
在CMakeLists.txt按照下面的格式书写:
cmake_minimum_required(VERSION 2.8.12)find_package(SofaFramework)sofa_add_subdirectory(plugin path_to_plugin1/ name_of_project_plugin1)
sofa_add_subdirectory(plugin path_to_plugin2/ name_of_project_plugin2)
添加几个插件sofa_add_subdirectory
就几行,比如我这里写的是:
cmake_minimum_required(VERSION 2.8.12)find_package(SofaFramework)sofa_add_subdirectory(plugin STLIB/ STLIB VERSION 3.0)
sofa_add_subdirectory
里第一个参数固定写plugin,第二个参数写这个插件的路径(这里使用的是相对路径:STLIB/
),第三个参数是这个插件里CMakeLists的项目的名字STLIB VERSION 3.0
:
在之前的cmake-gui里加入SOFA_EXTERNAL_DIRECTORIES
关键字,填入插件放置的路径:
接下来重复cmake-gui里已有的插件的步骤,除了fetch仓库不用做其他都是一样的。
另外还有插件安装视频的说明:
使用插件,在sofa的gui里打开Plugin Manager
添加对应的.so文件就好了,点击Add寻找(比如这里是libSTLIB.so)。
另外可以设置一下PATH和PYTHONPATH:
我这里的设置是r:
export PATH=/path/to/runSofa:$PATH
export PYTHONPATH=/path/to/SofaPython3:$PYTHONPATH
我这里设置的PYTHONPATH如下所示(安装了STLIB、SofaPython3、SoftRobots的插件),其中packages:/home/lsy/sofa/build/install/plugins/STLIB/lib/python3/site-packages:/home/lsy/sofa/build/install/plugins/SofaPython3/lib/python3/site-packages:/home/lsy/sofa/build/install/plugins/SoftRobots/lib/python3/site-packages
是新加入的。
/opt/ros/noetic/lib/python3/dist-packages:/home/lsy/sofa/build/install/plugins/STLIB/lib/python3/site-packages:/home/lsy/sofa/build/install/plugins/SofaPython3/lib/python3/site-packages:/home/lsy/sofa/build/install/plugins/SoftRobots/lib/python3/site-packages
以及PATH如下所示,其中/home/lsy/sofa/build/bin
是新加入的runSofa的路径:
/opt/ros/noetic/bin:/home/lsy/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/lsy/sofa/build/bin
在命令行输入runSofa
直接就能弹出小蛇的界面了。
runSofa
运行python文件**.py
(需要安装一下SofaPython3插件):
runSofa **.py
完活!
相关文章:

Linux上编译和安装SOFA23.06
前言 你可以直接使用编译安装好的SOFA版本Installing from all-included binaries (v23.06.00): 如果你想自己编译,可以看我下面写的内容,不过绝大多数是从官网来的,如果和官网有出入,建议还是以官网为准。 在Linux下…...
定时任务 Spring Task
一、介绍 Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位: 定时任务框架 作用: 定时自动执行某段Java代码 二、cron 表达式 cron表达式在线生成器:https://cron.qqe2.com/ 1、说明…...
golang 上传图片 --chatGPT
问:makeImgUpload(path string) 实现发送发送图片, 发送类型为 multipart/form-data gpt: 下面是一个简单的 makeImgUpload 函数的实现,用于发送图片并以 multipart/form-data 格式进行上传。请注意,此代码假设图片文件路径是正确…...

Android Studio 写一个Java调用c++ 的demo
前提条件: 本地已经配置好了ndk环境,如果没有配置好,建议参考macos 配置ndk环境-CSDN博客 这篇链接。 新建一个Empty Project 比如我这里的Project的名字是HelloJNI,包名是com.example.hellojni 然后在src目录下,右键选择Add C …...
Pandas数据操作_Python数据分析与可视化
Pandas数据操作 排序操作对索引进行排序按行排序按值排序 删除操作算数运算去重duplicated()drop_duplicates() 数据重塑层次化索引索引方式内层选取数据重塑 排序操作 对索引进行排序 Series 用 sort_index() 按索引排序,sort_values() 按值排序; Dat…...
【Debug】查询的数据量比数据库中的数据量还要多
今天前端反馈了一个bug,某个接口返回的数据很多,我到mysql数据库看了一下,查询的表名为trs_risk,其中只有1000多条数据,而页面返回有5000多条数据!! 匪夷所思啊,我定位到Mapper层的…...

nodejs微信小程序-慢性胃炎健康管理系统的设计与实现-安卓-python-PHP-计算机毕业设计
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...

二十一、数组(1)
本章概要 数组特性 用于显示数组的实用程序 一等对象返回数组 简单来看,数组需要你去创建和初始化,你可以通过下标对数组元素进行访问,数组的大小不会改变。大多数时候你只需要知道这些,但有时候你必须在数组上进行更复杂的操作…...
react hook 获取setState的新值
利用useRef 存储最新值 let [count,setCount] useState(0)let countRef useRef(count)let handleClick function (){setCount((prev)>{countRef.current prev1return countRef.current})console.info(countRef.current)}利用useRef let [count,setCount] useState(0)le…...

JVM判断对象是否存活之引用计数法、可达性分析
目录 前言 引用计数法 概念 优点 缺点 可达性分析 概念 缺点: 扩展: 1.GC Roots 概念 2.STW (Stop the world) 前言 JVM有两种算法来判断对象是否存活,分别是引用计数法和可达性分析算法,针对可达性分析算法STW时间长、…...

报道 | 2023年12月-2024年2月国际运筹优化会议汇总
2023年12月-2024年2月召开会议汇总: The 16th Annual International Conference on Combinatorial Optimization and Applications (COCOA 2023) Location: Virtual Important dates: Conference: December 11, 2023 (Start) - December 13, 2023 (End) Details…...
【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷C
单选题 1、A right triangle has a side that is 5cm long, and its hypotenuse is 13cm long.The area of the triangle is (). A、30 cm2 B、60 cm2 C、65 cm2 D、32.5 cm2 答案:A 2、一位旅客安检后走在前往登机口的路上。路途中一部…...

“升级图片管理,优化工作流程——轻松将JPG转为PNG“
在图片时代,无论是工作还是生活,图片管理都显得尤为重要。批量处理图片,将JPG格式轻松转换为PNG格式,能够使您的图片管理更优化,提高工作效率。 首先,我们进入首助编辑高手主页面,会看到有多种…...

基于Springboot的地方美食分享网站(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的地方美食分享网站(有报告)。Javaee项目,springboot项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍: 采用…...

助力水泥基建裂痕自动化巡检,基于yolov5融合ASPP开发构建多尺度融合目标检测识别系统
道路场景下的自动化智能巡检、洞体场景下的壁体类建筑缺陷自动检测识别等等已经在现实生活中不断地落地应用了,在我们之前的很多博文中也已经有过很多相关的实践项目经历了,本文的核心目的是想要融合多尺度感受野技术到yolov5模型中以期在较低参数量的情…...
rk3588使用vscode远程debug 配置文件
进入调试口,需要本地和远程都装C/C estension 下面是在调mpi_enc_test的launch.json 文件自己make生成的 makefile 没改过 args项是输入参数,配置了相机输入,具体参数看他的demo说明, 记录一下,方便以后拷贝方便 {// …...

隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态
2023年11月 NearCon2023 活动期间,基于 Cosmos SDK 构建的隐私协议 Secret Network,宣布使用 Octopus Network 开发的 NEAR-IBC,于2024年第一季度实现 Secret Network 与 NEAR Protocol 之间的跨链交互。 这将会是Cosmos 生态与 NEAR 之间的首…...

Milvus Standalone安装
使用Docker Compose安装 Milvus standalone(即单机版),进行一个快速milvus的体验。 前提条件: 1.系统可以使用centos 2.系统已经安装docker和docker-compose 3.milvus版本这里选择2.3.1 由于milvus依赖etcd和minio,…...

二分查找算法合集
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 时间复杂度 O(logn) 自己写二分算法 左闭右开 左开右闭C算法&a…...
SELinux零知识学习十八、SELinux策略语言之类型强制(3)
接前一篇文章:SELinux零知识学习十七、SELinux策略语言之类型强制(2) 二、SELinux策略语言之类型强制 2. 类型、属性和别名 (3)关联类型和属性 1)使用type语句关联类型和属性 迄今为止,我们…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...