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

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

------ 2024-04-03 夜

code review!

文章目录

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镜像:

sh 复制代码
docker build -t opengl-cpp-env .

这里的opengl-cpp-env是给这个镜像起的名字,可以根据喜好命名。

4.运行Docker容器

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

xhost +

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

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

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

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

sh 复制代码
docker run -it --rm -v $(pwd):/app opengl-cpp-env

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

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

使用glxinfo命令

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

sh 复制代码
sudo apt update
sudo apt install mesa-utils

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

sh 复制代码
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:

sh 复制代码
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

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

sh 复制代码
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
相关推荐
家有狸花1 小时前
VSCODE驯服日记(三):配置C++环境
c++·ide·vscode
dengqingrui1232 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝2 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
热爱嵌入式的小许2 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
ZZZ_O^O2 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
小飞猪Jay5 小时前
C++面试速通宝典——13
jvm·c++·面试
rjszcb6 小时前
一文说完c++全部基础知识,IO流(二)
c++
韩楚风6 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学6 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO6 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm