如何构建具有可移植数据根路径的Bison二进制文件?
解决Bison二进制硬编码路径无法跨机器迁移的问题
你遇到的问题是Bison在构建时会把--prefix指定的绝对路径硬编码到二进制文件里,导致迁移到其他机器后找不到m4sugar这类数据文件。这里有几个可行的解决办法:
方法1:构建时启用可重定位选项(推荐)
Bison的configure脚本自带--enable-relocatable选项,这个选项会让生成的二进制文件在运行时自动根据自身所在的位置,计算出数据文件的相对路径,不再依赖构建时的绝对路径。
修改你的构建命令即可:
./configure --prefix=/home/users/yuhao10/bison-3.4/output --enable-relocatable make make install
构建完成后,把整个output目录打包复制到其他机器的任意路径下,运行bin/bison时,它会自动从相对于自身位置的../share/bison路径查找所需的数据文件,不会再出现路径找不到的错误。
方法2:运行时通过环境变量指定数据路径
如果已经完成构建不想重新编译,可以通过设置BISON_DATADIR环境变量来告知Bison数据文件的位置。
比如把Bison目录放到新机器的/opt/my-bison路径下,运行前执行:
export BISON_DATADIR=/opt/my-bison/share/bison
或者直接在运行时临时设置环境变量:
BISON_DATADIR=$(pwd)/share/bison ./bin/bison
这样Bison就会从你指定的BISON_DATADIR路径下查找m4sugar等文件。
方法3:修改二进制文件的硬编码路径(进阶)
如果前两种方法都不适用,还可以尝试修改二进制文件里的硬编码路径,但这个方法比较复杂,容易出错,不推荐作为首选。比如用sed替换路径(注意要保证新旧路径长度一致,否则可能破坏二进制):
sed -i 's|/home/users/yuhao10/bison-3.4/output/share/bison|./../share/bison|g' ./bin/bison
如果路径长度不一致,可能需要用patchelf等工具调整,但操作门槛较高,优先用前两种方法更稳妥。
内容的提问来源于stack exchange,提问作者Yu Hao
相关产品推荐
相关产品推荐

