编译一个开源软件遇到的问题总结

news2024/11/30 10:41:47

一、开源软件Supra

需要编译一个开源的软件Supra,它需要的前置条件是:
1、cmake ≥ 3.4
2、gcc ≥ 4.8 or min. Visual Studio 2015 (Compiler needs to be supported by CUDA! For that, see the CUDA installation instructions.)
3、QT ≥ 5.5
4、TBB
5、CUDA ≥ 10.0
这个软件需要的依赖项还是比较多的,而且在图像处理中使用了TBB和CUDA,这两个本身就比较麻烦,所以总结一下,把这次编译的过程遇到的主要问题记录下来。
安装的环境为Ubuntu22.04桌面版本。

二、依赖安装

1、先说一下可以使用apt来安装的,包括Gcc,c++,GDB,这些都可以使用apt install来完成,默认的安装版本为Gcc11.3,GDB为gdb12.0.90。TBB也可以安装,默认安装的是libtbb12,坑儿在这儿埋下了,后面咱们再分析。cmake同样也可以使用apt来安装,默认版本是3.22.1.
2、CUDA这个比较好安装去官网按照指定的步骤选择对应的OS版本,就会出现安装下载的
安装步骤:
a) 查看显卡驱动信息
执行命令:

ubuntu-drivers devices

会显示出一个列表,来显示支持的驱动,一般推荐使用recommended版本的相关驱动。
查看当前显卡驱动的版本,并根据版本来安装相关的驱动,安装驱动可以使用apt-install来完成.

sudo apt install nvidia-driver-xxx

b) 验证
安装完成后输入nvidia-smi命令,会出现一个列表框,显示当前的显卡相关版本及驱动和CUDA的版本信息。

在这里插入图片描述

c) 官网下载并安装

https://developer.nvidia.com/cuda-toolkit-archive

在这里插入图片描述

选择Runfile格式安装:

wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run
sudo sh cuda_12.1.1_530.30.02_linux.run

安装过程有两个注意,一个是开始要选择Continue,另外一个就是在安装选项时,要去除驱动安装,因为前面已经安装了驱动。所以说,其实前面也可以不安装驱动在这里一起安装。安装完成后会有一个配置的方法让你进行环境变量的配置,在当前用户路径下的.bashrc中配置即可,记得要source ~/.bashrc一下,不同的终端也要如此。所以最好同一终端下或者启动一个新的终端。

d) 再次验证
执行命令:

nvcc -V

出现相关的版本信息即为安装成功。

3、Qt的安装
从Qt5.15开始,安装Qt开始使用Online方式,去清华大学的镜像地址下载:

https://mirrors.tuna.tsinghua.edu.cn/qt/archive/online_installers/4.5/

在这里插入图片描述

下载后:

sudo chmod 777 qt-unified-linux-x64-4.5.2-online.run
./qt-unified-linux-x64-4.5.2-online.run

安装的选项比较复杂,可以同时安装Qt6.5和Qt5.15。具体的安装过程这里就忽略,网上太多了。有两个注意点:一是安装时如果需要登陆帐号,可提前断网处理;二是安装完成后会有一个工具,不用每次执行这个Run包。这有点类似于VS中的Installer。

三、编译及问题解决

1、执行依赖选项准备

apt-get install cmake cmake-gui qt5-default libtbb-dev libopenigtlink-dev git

如果已经安装可以略过,比如Qt,cmake等。

2、编译
此处有两种编译方式,一种使用官网的方式:

mkdir -p $HOME/git && cd $HOME/git #(or your favorite directory for repositories)
git clone https://github.com/IFL-CAMP/supra.git
cd supra
mkdir -p build && cd build
cmake-gui ..

# 弹出窗口后首先在下拉列表框中选择编译目标为“Unix Makefiles”,其它都略过
a、 Configure    #在弹出的GUI界面选择指定的编译文件路径和输出路径,其下两个根据情况,配置好就不需要了
b、 For systems with multiple gcc versions, make sure to select one supported by the installed CUDA version
c、 You might need to specify the CUDA toolkit directory (usually "/usr/local/cuda")
d、 Configure & Generate, then close cmake and build  #此处会出现找不到Qt5的路径
e、 Build SUPRA
f、 make -j5

Start SUPRA: See below

第二种方法是直接建立build文件夹,然后进入后cmake …,同样会报找不到QT5路径的问题。
问题1:其现象为:

Building SUPRA Graphic Interface
CMake Error at src/GraphicInterface/CMakeLists.txt:8 (find_package):

By not providing "FindQt5.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "Qt5", but
  CMake did not find one.

  Could not find a package configuration file provided by "Qt5" with any of
  the following names:

    Qt5Config.cmake
    qt5-config.cmake

  Add the installation prefix of "Qt5" to CMAKE_PREFIX_PATH or set "Qt5_DIR"
  to a directory containing one of the above files.  If "Qt5" provides a
  separate development package or SDK, be sure it has been installed.

Configuring incomplete, errors occurred!

解决方式:
Ubuntu Add the installation prefix of “Qt5“ to CMAKE_PREFIX_PATH or set “Qt5_DIR

解决方法为:

#设置进.bashrc 中
export CMAKE_PREFIX_PATH=/home/xxx/Qt5.xx.x/5.xx.xx/gcc_64/  #xx处根据实际情况确定

设置好后继续编译
问题2:其现象为:

Make Error at src/CommandlineInterface/CMakeLists.txt:27 (ADD_EXECUTABLE):
  Target "SUPRA_CMD" links to target "Threads::Threads" but the target was
  not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?

CMake Error at src/SupraExecutor/CMakeLists.txt:25 (ADD_EXECUTABLE):
  Target "SUPRA_EXECUTOR" links to target "Threads::Threads" but the target
  was not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?

CMake Error at src/GraphicInterface/CMakeLists.txt:124 (add_executable):
  Target "SUPRA_GUI" links to target "Threads::Threads" but the target was
  not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?

CMake Error at src/Wrapper/CMakeLists.txt:22
(ADD_EXECUTABLE):
  Target "SUPRA_Wrapper" links to target "Threads::Threads" but the target

编译找不到Threads库,解决方法为
(https://discourse.cmake.org/t/cmake-3-21-rc-1-threads-threads-not-found/3630):

find_package(Threads REQUIRED)
target_link_libraries(foo PRIVATE Threads::Threads)  ---foo修改为编译执行名称

解决过程:

步骤:

1、直接在Supra根目录下CMakefilelist.txt,增加,无法处理foo,配置报错。
2、直接改到根目录下的SRC目录中包含的四个CMakefilelist.txt的Add an executable后增加,并将Foo修改为 Add an executable中的名字,如SUPRA-GUI等 。
又报:
  he keyword signature for target_link_libraries has already been used with   the target "SUPRA_GUI".
 All uses of target_link_libraries with a target   must be either all-keyword or all-plain.
  这时将添加Threads  移到最前面去,如下:
TARGET_LINK_LIBRARIES(SUPRA_GUI
Threads::Threads                     ----------------此处
${SUPRA_Lib_LIBRARIES}
${CAMPVIS_LIB}
${NodeEditor_LIBRARIES}
	-----------原来在此处
)
3、将其移植到默认(原有之处 )的中去:
 CMake Error at /home/fpc/Qt515/5.15.2/gcc_64/lib/cmake/Qt5Core/Qt5CoreMacros.cmake:454 (target_link_libraries):
  The keyword signature for target_link_libraries has already been used with
  the target "SUPRA_GUI".  All uses of target_link_libraries with a target
  must be either all-keyword or all-plain.
  The uses of the keyword signature are here:
   * src/GraphicInterface/CMakeLists.txt:156 (TARGET_LINK_LIBRARIES)
Call Stack (most recent call first):
将错误 的地方那个 CmakeFilelist .txt 中的PRIVATE删除即可。

继续编译。
问题3:其现象为:
(https://github.com/linuxdeepin/deepin-system-monitor/issues/34)

CMake Error at /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor_stamp/NodeEditor-build-.cmake:49 (message):
  Command failed: 2
   'make'
  See also
    /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor_stamp/NodeEditor-build-*.log

其内容为:
    In file included from /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor/include/nodes/internal/DataModelRegistry.hpp:12,
                 from /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor/include/nodes/internal/FlowScene.hpp:13,
                 from /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor/src/ConnectionGraphicsObject.cpp:9:
/home/fpc/code/supra/build/src/GraphicInterface/NodeEditor/include/nodes/internal/QStringStdHash.hpp:11:8: error: redefinition of ‘struct std::hash<QString>’
   11 | struct hash<QString>
      |        ^~~~~~~~~~~~~
In file included from /home/fpc/Qt515/5.15.2/gcc_64/include/QtCore/qlist.h:47,
                 from /home/fpc/Qt515/5.15.2/gcc_64/include/QtCore/qobject.h:49,
                 from /home/fpc/Qt515/5.15.2/gcc_64/include/QtWidgets/qgraphicsitem.h:44,
                 from /home/fpc/Qt515/5.15.2/gcc_64/include/QtWidgets/QGraphicsObject:1,
                 from /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor/include/nodes/internal/ConnectionGraphicsObject.hpp:7,
                 from /home/fpc/code/supra/build/src/GraphicInterface/NodeEditor/src/ConnectionGraphicsObject.cpp:1:
/home/fpc/Qt515/5.15.2/gcc_64/include/QtCore/qhashfunctions.h:204:1: note: previous definition of ‘struct std::hash<QString>’

重定义问题,解决方法:
直接进入到具体文件,将冲突重定义类全部注释


/*
namespace std {
template<>
struct hash<QString>{
inline std::size_t
operator()(QString const &s) const {
return qHash(s);
*/

这里需要注意的是,这个是编译动态生成的,所以在修改后不能重新cmake,而是要

make clean
make -j5

一定要注意,否则还得重新修改,陷入了死循环。

继续编译,遇到了TBB的问题。
问题4:其现象为:

/usr/include/oneapi/tbb/profiling.h:229:15: error: expected unqualified-id before ‘)’
token
  229 |     void emit() { }
      |              
 ^
/usr/include/oneapi/tbb/profiling.h:231:22: error: expected unqualified-id before ‘const’
  231
 |     static void emit(const std::string &) { }
      |                      
^~~~~
/usr/include/oneapi/tbb/profiling.h:231:22: error: expected ‘)’ before ‘const’
  231 |     
static void emit(const std::string &) { }
      |                     
~^~~~~
      |                      )
In file included from /usr/include/oneapi/tbb/spin_mutex.h:23,

from /usr/include/oneapi/tbb/flow_graph.h:26,

from /usr/include/tbb/flow_graph.h:17,

from /home/fpc/code/supra/src/SupraLib/AbstractInput.h:21,

from /home/fpc/code/supra/src/SupraLib/SupraManager.h:23,

from /home/fpc/code/supra/src/GraphicInterface/parametersWidget.cpp:
10:
/usr/include/oneapi/tbb/profiling.h:229:15:
error: expected unqualified-id before ‘)’ token
  229 |     
void emit() { }
      |               
^
/usr/include/oneapi/tbb/profiling.h:231:22: error: expected unqualified-id before ‘const’
  231 |  
   static void emit(const std::string &) { }
      |                    
  ^~~~~
/usr/include/oneapi/tbb/profiling.h:231:22: error: expected ‘)’ before ‘const’
  231 |    
 static void emit(const std::string &) { }
      |                     ~^~~~~
      |                      )

[ 94%] Built target SUPRA_CMD

这个就比较恶心了,后来通过前面对apt的使用方式来判断当前版本其实安装的为libtbb12,即使用:

sudo apt install libtbb-dev

使用:

sudo apt list |grep libtbb*

可以列出发现安装版本为oneTbb,到具体的库路径和头文件下都可以看到有oneapi的名称。此时再使用制裁的命令:

sudo apt remove libtbb-dev
sudo apt autoremove

apt search libtbb-dev
sudo apt install libtbb2-dev

再查找一下相关软件包列出来,安装指定的libttb2即可。
再次整体编译,即可发现成功。如果有什么问题,可以执行:

make clean
make -j5

这个重复了数次才算成功,不太顺手。

四、启动软件

按照github上的方法:

src/GraphicInterface/SUPRA_GUI -c data/configDemo.xml -a

出现运行界面即OK。

五、总结

安装这个软件遇到了两个比较麻烦的事情,一个是Threads这个问题,在百度上几乎没有解决方法,即使有的,也不全,只有部分。可怜的国内程序员,解决问题都如此难。第二个是TBB的版本问题,搞得不得安生,亏得有人帮忙,才解决了。国内的软件安装太麻烦了,好多软件都下载不了,包括Github也经常断网,更别提别的了。下个虚拟机,也得等上半天。在线安装Qt,不断让重试。
而且使用的Gcc版本有点高,即使Supra编译成功了,也有大量的警告,如果使用Gcc9就没有这些警告。看来还是需要比较好的确定各种版本,这样才会少走弯路。这也是Linux下开发的一个痛点吧。

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

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

相关文章

infuluxdb时序数据库介绍

时序数据库&#xff08;influxdb&#xff09; InfluxDB是一个开源的、高性能的时序型数据库&#xff0c;在时序型数据库DB-Engines Ranking上排名第一。 下载地址:https://dl.influxdata.com/influxdb/releases/influxdb2-2.3.0-windows-amd64.zip 启动&#xff1a; CMD到解压…

游戏服务器被攻击怎么办

游戏服务器的安全是每个游戏开发者和管理员必须关注的问题。然而&#xff0c;尽管有各种防御措施&#xff0c;游戏服务器仍然可能受到攻击。小编将为您介绍游戏服务器被攻击的原因&#xff0c;并提供一些解决方案。 游戏服务器被攻击的原因 1. DDoS 攻击 DDoS 攻击是最常见的攻…

【SSA-LSTM】基于SSA-LSTM预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CRM软件标准版和定制版有什么分别

CRM系统能够帮助企业管理客户互动&#xff0c;跟踪客户数据&#xff0c;实现业务流程自动化。很多企业不太了解&#xff0c;标准CRM软件和定制CRM软件的区别是什么&#xff0c;该如何选择&#xff1f;下面我们来说说定制CRM的优势。 什么是标准CRM软件&#xff1f; 标准CRM软…

计算机组成原理---第七章 外围设备习题详解版

&#xff08;一&#xff09;课本例题 &#xff08;二&#xff09;课后习题 1.计算机的外围设备是指除了CPU和内存以外的其它设备。 2.打印机根据印字方式可以分为击打式和非击打式两大类&#xff0c;在击打式类打印机中&#xff0c;只有针型打印型打印机才能打印汉字。 3.一…

Protein Cell:基于R语言的微生物组数据挖掘最佳流程(大众评审截止14号晚6点)...

Protein & Cell综述&#xff1a;基于R语言的微生物组数据挖掘的最佳流程 近日&#xff0c;中国农业科学院刘永鑫组联合南京农业大学袁军组在国际期刊 Protein & Cell (IF 15.3) 发表了题为”“The best practice for microbiome analysis using R”的综述论文&#xf…

辉哥带你学hive第一讲 hive基本介绍以及环境搭建

文章目录 1.Hive介绍1.1 hive 基本情况1.2 Hive架构原理1.3 Hive 安装1.4 元数据配置1.5 hive 服务部署1.6Hive常用交互命令1.6.1 Hive参数配置方式1.Hive介绍 1.1 hive 基本情况 hive基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表。 Hive是一个Hadoop客…

【扰动识别】S变换电能质量扰动识别(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

黎曼积分的概念

黎曼积分的概念 引入 设 f f f是闭区间 [ a , b ] [a,b] [a,b]上的非负连续函数&#xff0c; D D D是坐标系中由直线 x a xa xa&#xff0c; x b xb xb&#xff0c; x x x轴和曲线 y f ( x ) yf(x) yf(x)围成的图形。求 D D D的面积 S S S。 我们可以在 [ a , b ] [a,b] …

蓝桥杯模块学习2——LED灯

第一章 硬件部分 1.1 为什么要了解硬件部分&#xff1f; 比赛的时候会给出原理图&#xff0c;如果我们能够深入的理解硬件&#xff0c;就可以从中推导出代码应该怎样写&#xff0c;而不用死记硬背 1.2 电路的组成部分 1.2.1 74HC573锁存器 原理图&#xff1a; ​​​​​​​…

Claude的奇妙之旅:一起探索人工智能的无限可能

是一款由Anthropic公司开发的人工智能应用&#xff0c;可以在Slack中使用。可以理解和生成自然语言&#xff0c;帮助用户完成各种任务&#xff0c;如写小说、编写代码、解释概念等。的特点是&#xff1a; - 是免费的&#xff0c;不需要申请或下载&#xff0c;只需要在Slack中添…

网络安全合规-OKR和KPI

首先我们还是要区分OKR和KPI的关系区别&#xff1a; 我们可以从几个方面来看两者的差别&#xff1a; 第一&#xff0c;从核心驱动上区分 KPI 以考核为核心驱动&#xff1b;OKR 以成果为核心驱动。 KPI &#xff1a;就是把工作“量化成数据”&#xff0c;当成个人的考核标准&…

若依框架讲解后端利用DefaultKaptcha生成验证码及校验

pom文件中引入DefaultKaptcha的依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency>Kaptcha 是一个可高度配置的实用验证码生成工具&#xff0c;…

个人 [Raft项目] 记一次内存泄漏排查

1 .发现过程 笔者在一步一步写Raft协议, 在可以跑了一天后,发现Leader节点的内存使用量缓慢上涨, 且手动执行GC后也没达到预期水平线 Leader节点内存情况 在对Java有深入了解的读者其实是可以理解内存使用量的产生 笔者的测试用例是: 启动四个节点,查看一天后的内存攀升, Le…

大专生,本科生,正在成为求职市场最尴尬的存在-我反对此言论,因为高成本,低科技,低利润产业将是中国未来五十年的主要特点

有很多视觉人机器视觉粉丝咨询我,我大专生可以学机器视觉开发吗? 我这里回答下:可以,你要自信点,下三年苦功夫,去学习,去专研,去找一个好点公司平台或者好点的培训机构。 学历不是评价一个人的唯一标准,但是它一直是社会对个人综合素质和知识储备的一种重要衡量标准…

卡尔曼滤波器-公式简单推导 | 原理分析 | 将卡尔曼滤波器在MatLab中简单实现

目录 1.状态转移2.协方差矩阵3.噪声协方差矩阵的传递4.观测矩阵5.状态更新6.噪声协方差矩阵的更新7.在MatLab中实现卡尔曼滤波器1.状态转移 卡尔曼滤波器又称为最佳线性滤波器。优点有实现简单、纯时域滤波器、不需要进行频域变换等。 假设有一辆汽车在路上行驶,用位置和速度…

Android+SQLite家庭食物储藏有效期提醒信息app源码

一个新的时代--移动互联网已经微笑着迎面而来。移动互联网与智能手机有着自身独特的优势&#xff0c;使得人们更方便的办公、娱乐&#xff0c;生活更加轻松。为了使人们对家庭里的食物能够更科学的管理&#xff0c;让人们随时随地能了解家庭所储藏食物的情况&#xff0c;及时让…

《程序员面试金典(第6版)》面试题 16.21. 交换和(哈希法,双指针,二分查找)

题目描述 给定两个整数数组&#xff0c;请交换一对数值&#xff08;每个数组中取一个数值&#xff09;&#xff0c;使得两个数组所有元素的和相等。题目入口 返回一个数组&#xff0c;第一个元素是第一个数组中要交换的元素&#xff0c;第二个元素是第二个数组中要交换的元素。…

vscode编译mysql-boost-5.7.37如何设置Cmake:configuration以及成功debug教程

前提&#xff1a;已经在服务器上编译安装好mysql5.7.37源码了&#xff0c;这里只是记录一下使用vscode远程连接服务器时如何成功debug&#xff0c;这篇与我发布的关于openGauss源码部署有双向链接关系&#xff0c;后续可方便查看。 1. 远程连接服务器进入连接界面 2. 设置Cmak…

《计算机网络—自顶向下方法》 第三章Wireshark实验:DNS协议分析

域名系统 DNS(Domain Name System) 是互联网使用的命名系统&#xff0c;用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS&#xff0c;但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字&#xff0c;并使…