Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像

Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像

—— 2024-04-03 夜

code review!

文章目录

  • Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像
    • 1.这里把这本书的例程代码放在了Dockerfile所在的文件夹内以使镜像预装例程代码
    • 2.创建Dockerfile
    • 3.构建Docker镜像
    • 4.运行Docker容器
    • 5.随便找个书中例程编译运行,发现没有反应
    • 6.原因是宿主机的OpenGL不对,查看OpenGL版本
    • 7.修改例程main.cpp重新编译运行
    • 8.可以在ubuntu 18.04中运行ubuntu20.04的docker镜像构建的容器吗?
    • 9.SOIL2库的问题
      • 9.1.修改Dockerfile
      • 9.2.库处理

1.这里把这本书的例程代码放在了Dockerfile所在的文件夹内以使镜像预装例程代码

在这里插入图片描述

在这里插入图片描述

2.创建Dockerfile

# 使用官方Ubuntu基础镜像
FROM ubuntu:20.04# 避免在安装过程中由于时区设置导致的停滞
ENV DEBIAN_FRONTEND=noninteractive# 安装基本工具
RUN apt-get update && apt-get install -y \build-essential \xorg-dev \libglu1-mesa-dev \libglew-dev \libsdl2-dev \libsdl2-image-dev \libglm-dev \libfreetype6-dev \libglfw3 \libglfw3-dev \libsoil-dev \freeglut3-dev \mesa-utils \git \wget \# 基本C++构建环境g++ \cmake \mesa-common-dev \# 文本编辑器vim# 清理缓存以减小镜像大小
RUN apt-get clean && rm -rf /var/lib/apt/lists/*# 设置工作目录
WORKDIR /app# 可以选择复制本地代码到容器中
COPY ./book_demo /app# 设置环境变量,例如GLFW库的路径等
# ENV LIBRARY_PATH=/path/to/library# 编译你的OpenGL程序
# RUN g++ -o myapp main.cpp -lGL -lGLU -lglfw -lGLEW# 设置一个默认的命令(可选)
# CMD ["./myapp"]

3.构建Docker镜像

在包含Dockerfile的文件夹内打开一个终端,执行以下命令来构建Docker镜像:

docker build -t opengl-cpp-env .

这里的opengl-cpp-env是给这个镜像起的名字,可以根据喜好命名。
在这里插入图片描述

4.运行Docker容器

确保X服务器允许来自本地所有用户的连接。在宿主机的终端中执行以下命令:

xhost +

这将允许所有用户连接到X服务器。出于安全考虑,在完成容器的使用后,应通过运行xhost -来撤销此权限。

当镜像构建完成后,可以使用以下命令运行容器:

docker run -it --rm \-v /tmp/.X11-unix:/tmp/.X11-unix \-e DISPLAY=$DISPLAY \opengl-cpp-env

在这里插入图片描述

如果需要与容器共享文件系统,可以使用-v参数挂载本地目录到容器中:

docker run -it --rm -v $(pwd):/app opengl-cpp-env

5.随便找个书中例程编译运行,发现没有反应

在这里插入图片描述

6.原因是宿主机的OpenGL不对,查看OpenGL版本

使用glxinfo命令

glxinfo是一个显示有关OpenGL和GLX的信息的程序。首先,确保安装了mesa-utils包:

sudo apt update
sudo apt install mesa-utils

然后运行glxinfo命令来查找OpenGL版本:

glxinfo | grep "OpenGL version"

这应该会输出你的OpenGL版本,例如:

OpenGL version string: 4.6.0 NVIDIA 390.77

运行,发现是3.3版本
在这里插入图片描述

注意:

  • 在虚拟机中,显示的OpenGL版本可能是虚拟化软件模拟的版本,而不是宿主机硬件实际支持的版本。
  • 如果在虚拟机中,确保安装了虚拟机的增强工具(比如VMware Tools或VirtualBox Guest Additions),这样可以获得更好的图形性能和更准确的OpenGL版本信息。

如果发现OpenGL版本较低,可能需要更新显卡驱动或在物理硬件上测试OpenGL程序。

7.修改例程main.cpp重新编译运行

在这里插入图片描述

编译:

g++ main.cpp -o main -lGLEW -lglfw -lGL

运行:
在这里插入图片描述

8.可以在ubuntu 18.04中运行ubuntu20.04的docker镜像构建的容器吗?

是的,可以在Ubuntu 18.04中运行为Ubuntu 20.04构建的Docker容器。Docker的设计目的之一就是提供隔离,这意味着运行容器的宿主机操作系统与容器内的操作系统版本可以不同。

容器内的应用程序与其依赖项都被封装在镜像中,该镜像包含了运行该应用程序所需的一切。因此,只要宿主机安装的Docker引擎版本是兼容的,并且宿主机的内核支持容器所需的所有功能,就可以在Ubuntu 18.04上运行为Ubuntu 20.04构建的容器。

请确保宿主机上安装了最新版本的Docker。可以通过执行以下命令来安装或更新Docker:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

安装或更新Docker后,在宿主机上运行容器的命令与在任何其他支持的Linux发行版上运行容器的命令相同。例如:

docker run -it ubuntu:20.04

这将启动一个基于ubuntu:20.04镜像的容器,您可以在其中运行命令。只要Docker守护程序正在运行,就应该能够无差别地执行此操作,不管宿主机的Ubuntu版本是多少。

9.SOIL2库的问题

9.1.修改Dockerfile

# 使用官方Ubuntu基础镜像
FROM ubuntu:20.04# 避免在安装过程中由于时区设置导致的停滞
ENV DEBIAN_FRONTEND=noninteractive# 安装基本工具
RUN apt-get update && apt-get install -y \build-essential \xorg-dev \libglu1-mesa-dev \libglew-dev \libsdl2-dev \libsdl2-image-dev \libglm-dev \libfreetype6-dev \libglfw3 \libglfw3-dev \# libsoil-dev \ # 这是原始SOIL库的安装项,SOIL2需要从源码编译freeglut3-dev \mesa-utils \git \wget \# 基本C++构建环境g++ \cmake \mesa-common-dev \# 文本编辑器vim# 下载并安装 premake
RUN wget https://github.com/premake/premake-core/releases/download/v5.0.0-alpha16/premake-5.0.0-alpha16-linux.tar.gz \&& tar -xzvf premake-5.0.0-alpha16-linux.tar.gz \&& mv premake5 /usr/local/bin \&& rm premake-5.0.0-alpha16-linux.tar.gz# 克隆SOIL2的源码并编译安装
RUN git clone https://github.com/SpartanJ/SOIL2.git \&& cd SOIL2 \&& premake5 gmake \&& cd make/linux \&& make -f soil2-static-lib.make \&& make -f soil2-shared-lib.make \&& cp ../../lib/linux/* /usr/local/lib/ \&& cp ../../src/SOIL2/SOIL2.h /usr/local/include/ \&& cp -r ../../src/common /usr/local/include/ \&& ldconfig# 清理缓存以减小镜像大小
RUN apt-get clean && rm -rf /var/lib/apt/lists/*# 设置工作目录
WORKDIR /app# 可以选择复制本地代码到容器中
COPY ./book_demo /app# 设置环境变量,例如GLFW库的路径等
# ENV LIBRARY_PATH=/path/to/library# 编译你的OpenGL程序
# RUN g++ -o myapp main.cpp -lGL -lGLU -lglfw -lGLEW -lsoil2# 设置一个默认的命令(可选)
# CMD ["./myapp"]

9.2.库处理

改动文件目录结构

mkdir -p /usr/local/include/SOIL2
mv /usr/local/include/SOIL2.h /usr/local/include/SOIL2/soil2.h

修改软链接

ln -s /usr/local/lib/libsoil2-debug.so /usr/local/lib/libsoil2.so

编译命令

g++ -o main *.cpp -lGLEW -lglfw -lGL -lsoil2 -I/usr/local/include -L/usr/local/lib

在这里插入图片描述

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

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

相关文章

PDF编辑和格式转换工具 Cisdem PDFMaster for Mac

Cisdem PDFMaster for Mac是一款功能强大的PDF编辑和格式转换工具。它为用户提供了直观且易于使用的界面,使常用功能触手可及,从而帮助用户轻松管理、编辑和转换PDF文件。 软件下载:Cisdem PDFMaster for Mac v6.0.0激活版下载 作为一款完整的…

15 个最佳 Word 文档恢复工具 [免费下​​载]

MS Word 文档恢复的重要性 对于严重依赖 Microsoft Word 创建和编辑文档的个人和企业来说,MS Word 文档恢复是一个至关重要的方面。 文件损坏、系统崩溃和其他意外事件可能会导致 Word 文档中存储的重要数据丢失。 及时恢复这些文档有助于节省时间、精力和资源。 本…

GD32F470_寻迹避障模块 TCRT5000红外反射传感器模块移植

2.6 红外循迹传感器 红外循迹传感器采用TCRT5000红外反射传感器,一种集发射与接收于一体的光电传感器,它由一个红外发光二极管和一个NPN红外光电三极管组成。检测反射距离1mm-25mm适用,传感器特设M3固定安装孔,调节方向与固定方便…

【绩效管理】帮助零售企业建立分层分类绩效考核体系项目纪实

购物中心张经理评价:“员工的绩效管理一直是困扰我公司的难题,我们只懂得怎么经营,至于怎么做人力资源管理,真是一点都不懂。这次华恒智信为我们提供的服务对我们的帮助很大。基于企业实际调研情况,华恒智信专家明确指…

前端学习之DOM编程-案例div移动

这个案例是当你的鼠标按压下去后&#xff0c;div跟着你的鼠标移动而移动&#xff0c;当你的鼠标抬起后&#xff0c;div不随着鼠标移动而移动。类似于电脑移动应用图标的感觉。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

day02-SpringCloud02(Nacos、Feign、Gateway)

1.Nacos 配置管理 Nacos 除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#x…

比例多路阀控制器US-DAT2-A

液压比例阀放大器是一种用于精确控制液压系统的技术&#xff0c;它通过电信号实现对液压阀的连续量控制。接收来自控制器的低功率电信号&#xff0c;然后将其放大并转换为高功率信号&#xff0c;这个高功率信号足以驱动比例阀的开启和关闭。这种技术允许进行非常精细的调节&…

面经分享(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级&#xff1a;核心简洁&#xff0c;只提供了基本的功能&#xff0c;其他高级功能可以通过插件或扩展来添加。 b. 灵活性&#xff1a;允许开发者选择适合自己项目的组件和工具&#xff0c;没有强制的项目结构和设计模式。 c. 易于扩展&#xff1a;提…

深度剖析:网络安全中的红蓝对抗策略

红蓝对抗 红蓝对抗服务方案 在蓝队服务中&#xff0c;作为攻击方将开展对目标资产的模拟入侵&#xff0c;寻找攻击路径&#xff0c;发现安全漏洞和隐患。除获取目标系统的关键信息&#xff08;包括但不限于资产信息、重要业务数据、代码或管理员账号等&#xff09;外&#x…

ubuntu20.04.6将虚拟机用户目录映射为磁盘Z

文章目录 linux虚拟机设置为NAT模式安装sshd服务映射目录到windows磁盘安装samba套件修改配置文件smb.conf重启smbd并设置用户名和密码 windows映射遇到的问题1、设置好之后映射不成功2、smbd下载失败3、smbd密码配置问题4、当有改动时候&#xff0c;最好重启一下smbd服务 linu…

碧桂园服务净利降两成,关联交易收入仅占2.9%,发力增值服务充电桩日进超10万

自2018年分拆上市以来&#xff0c;碧桂园服务经历过非常高速的发展&#xff0c;曾是物管市场的“并购王”&#xff0c;但从2023年开始&#xff0c;希望从外延式的增长向内生式增长转型&#xff0c;将往期的经验与教训&#xff0c;通过投后管理沉淀下来&#xff0c;向高质量发展…

【Ambari】Ansible自动化部署大数据集群

目录 一&#xff0e;版本说明和介绍信息 1.1 大数据组件版本 1.2 Apache Components 1.3 Databases支持版本 二&#xff0e;安装包上传和说明 三&#xff0e;服务器基础环境配置 3.1global配置修改 3.2主机名映射配置 3.3免密用户名密码配置 3.4 ansible安装 四. 安…

2024年MathorCup妈妈杯数学建模思路C题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

认知觉醒:开启自我改变的原动力-- 读书笔记

文章目录 关于本书以及作者内容第一章 大脑——一切问题的起源摘抄思考 第二章 生命留给我们的彩蛋摘抄思考 第三章 人类的终极能能力摘抄思考 第四章 专注力——情绪和智慧的交叉地带摘抄思考 第五章 学习力——学习不是一味地努力摘抄思考 第六章 行动力——没有行动世界只是…

DFS:floodfill算法解决矩阵联通块问题

floodfill&#xff0c;翻译为洪水灌溉&#xff0c;而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。 一、图像渲染 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int prev;//记住初始值int m,…

《QT实用小工具·十六》IP地址输入框控件

1、概述 源码放在文章末尾 该项目为IP地址输入框控件&#xff0c;主要包含如下功能&#xff1a; 可设置IP地址&#xff0c;自动填入框。 可清空IP地址。 支持按下小圆点自动切换。 支持退格键自动切换。 支持IP地址过滤。 可设置背景色、边框颜色、边框圆角角度。 下面…

2023年度总结:允许迷茫,破除迷茫;专注自身,把握当下

0、前言 &#x1f4dc;为什么24年已经过了几个月&#xff0c;才提笔写这年度总结呢&#xff1f;毫不羞愧直问我的内心&#xff0c;其实就是懒罢了。直到前几天朋友看到了我去年写的总结&#xff0c;我自己点进那篇总结&#xff0c;完完整整的看了一遍&#xff0c;又翻看我23年…

力扣Lc28---- 557. 反转字符串中的单词 III(java版)-2024年4月06日

1.题目描述 2.知识点 1)用StringBuilder的方法 实现可变字符串结果 最后返回的时候用.toString的方法 2)在Java中使用StringBuilder的toString()方法时&#xff0c;它会返回StringBuilder对象当前包含的所有字符序列的字符串表示。 在我们的例子中&#xff0c;sb是一个Stri…

Docker基本学习(运维)

一、背景介绍 1.什么是docker Docker&#xff0c;翻译过来就是码头工人 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。容器完全使用沙盒…

stm32 HAL中断GPIO——1

1选择引脚为中断 中断详细配置 1 模式选择 上拉下拉 再点击NVIC可进行分组 再勾选如图 总结步骤 1选择中断 2配置时钟//选择外部时钟 3配置模式 4勾选NVIC