这两天在服务器上配置google-deepmind/lab这个项目的环境,也是让我非常的头大。这个项目使用bazel作为它的构建程序,构建过程中遇到了bazel版本不匹配(实测需要6.4.0版本,新版的构建结果目录结构与项目指定结构不一致),缺少osmesa库,缺少llvm等各种各样的问题。经过将近三天的奋战,现在项目终于是能跑起来了,所以忙里偷闲一下,在这篇文章里简单记录一点心得。
在构建过程中出现了非常多的问题,包括但不限于:
bazel的沙盒环境,会阻止系统环境变量的传递,因此为了读取一些非标准路径下的库和头文件等,需要在构建命令中使用
--action_env
进行显式传递。对于一些三方库,即便传递
CFLAGS
也没有用,需要在WORKSPACE
配置中将这些库的路径加入工作区,以SDL2
库为示例:# WORKSPACE new_local_repository( name = "sdl_system", build_file = "@//bazel:sdl.BUILD", path = "/path/to/sdl2", ) # sdl.BUILD # Description: # Build rule for SDL2. # Compiler and linker flags found with `sdl2-config --libs --cflags`. cc_library( name = "sdl2", hdrs = glob(["include/SDL2/*.h"]), defines = ["_REENTRANT"], includes = ["include/SDL2"], linkopts = [ "-L/path/to/sdl2/lib", # SDL2 库路径 "-lSDL2", ], visibility = ["//visibility:public"], )
bazel run过程中不使用沙盒,因此需要将传入沙盒的环境变量相应地设置在系统中。
沙盒中连不上github等的问题,需要使用科学上网的方法,我这里采用的是
v2ray
,在Releases · v2fly/v2ray-core (github.com)中下载v2ray
的核心,unzip v2ray.zip -d your/path
解压到指定目录后,进入安装目录,在config.json
中配置outbound
,然后在程序所在目录运行./v2ray run
启动v2ray
。在构建过程中,设置http_proxy
和https_proxy
两个环境变量即可在构建中使用代理服务。
除了以上问题之外,令我最头疼的莫过于libosmesa-dev
这个软件包的安装过程了。首先尝试使用.deb
直接解压,但是发现里面一个关键的动态库libosmesa.so
是一个符号链接,但是指向的源文件libosmesa.so.8
又不存在,令人非常恼火。因此我又去找到了mesa
的源代码,打算进行编译安装,它的编译程序选择的是meson,当然,编译mesa
的难度不逊于编译lab
,又是缺少一堆这样那样的库,以至于为了编译它我还动手编译了LLVM
的源代码。但是最后在编译的过程中依然是找不到LLVM
的动态运行依赖,折腾了半天除了练习一堆meson setup/ meson build install --prefix
这样的命令之外一无所获。
但是不甘心的我又不愿意放弃,所以我就在另外一台有root权限的服务器上尝试安装libosmesa-dev
这个程序包(本来是想直接安装好复制粘贴过去的hh),由于网络问题没能安装上,但是报错信息给出了安装它的所有依赖包。正是这个报错信息给了我灵感,我打算手动执行一遍apt安装软件的过程,于是我又下载了一遍libosmesa-dev
这个软件的.deb
包,然后问了一下ChatGPT,意外发现了这个包使用ar
工具解压之后,会包含一些该软件包的依赖关系,很方便地就可以找到它上层的依赖包,例如libosmesa6
,正是这个包中包含我需要的libosmesa.so.8
这个动态库,于是我手动的将原来的符号链接链接到这个库,完美解决~
这里记录一下.deb
的正确食用方法:
解压
.deb
文件ar x libosmesa6-dev_23.2.1-1ubuntu3.1~22.04.2_amd64.deb
会得到以下三个文件:
- control.tar.zst:包含安装脚本和元数据,例如依赖关系等
- data.tar.zst:包含实际安装文件
- debian-binary:Debian包格式版本信息
解压
data.tar.zst
mkdir -p /home/username/custom_dir tar -xf data.tar.zst -C /home/username/custom_dir
处理依赖
tar -xf control.tar.zst cat control
输出的
Depends
字段会列出依赖的包,需要手动下载并按照相同方法解压它们。
以上就是这几天配环境的时候获得的一些心得,先记录到这里吧。