emacs linux 有静态发行版?类似于 windows 的发行版或者像 go 程序编译结果

想在一个啥都没的跳板机上跑 emacs. 自己编译了一个放上去,提示

emacs-27/src/emacs: error while loading shared libraries: 
libtiff.so.5: cannot open shared object file: No such file or directory
1 个赞

emacs不仅仅是一个可执行文件,编译过程中也是会生成其它可执行文件和共享库的。

在生成机上用prefix临时指定一个空目录 ./configure --prefix=XXX … make -j4 install后拷贝整个prefix目录到目标机

我其实是在项目根目录下 make 完把整个文件夹上传了。libtiff.so.5 这种是系统的共享库,目标机上没有

找了个 AppImage 还是不行:

/lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./Emacs-27.2.glibc2.16-x86_64.AppImage)

/lib64/libc.so.6这个是系统相关的C库,两台机器系统应该不一样. 两台机器的uname -a输出是啥?

跳板机没有 uname 命令 :joy: 我估计是某个版本的 centos 改装

尝试静态链接: LDFLAGS=-static ./configure … make完看下ldd emacs的动态依赖

太老的centos可以用gentoo prefix

LDFLAGS=-static 是可以安全静态链接的,我机器上生成的emacs 25M

看看这个?

1 个赞

还是有各种问题,我在 ubuntu 20.04 下编译 emacs 27.2

/usr/bin/ld: cannot find -lasound
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgnutls.a(hash.o): in function `hash_lookup':
(.text+0x680): multiple definition of `hash_lookup'; fns.o:/home/wenpin/b/gnu/emacs/emacs-static/src/fns.c:4309: first defined here
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libgnutls.a(hash.o): in function `hash_string':
(.text+0x870): multiple definition of `hash_string'; fns.o:/home/wenpin/b/gnu/emacs/emacs-static/src/fns.c:4558: first defined here
/usr/bin/ld: cannot find -llcms2
collect2: error: ld returned 1 exit status

可以把编译结果上传我试一下吗

不行,我的机器是aarch64, 你的是x86_64, 传给你也跑不起来。

Emacs的编译过程:

  1. git clone --depth=1 --branch=emacs-27 GitHub - emacs-mirror/emacs: Mirror of GNU Emacs emacs-27
  2. cd emacs-27
  3. ./autogen.sh
  4. LDFLAGS=-static ./configure --prefix=XXX
  5. make -j4 install

4th, configure时, 检查有没有error, 如果有,有2个选择,安装缺失的依赖库, 或者使用–without-XXX 进行剔除, 具体可以看帮助:./configure --help

这是我机器上最终生成的emacs可执行文件

1 个赞

ah, 日常用机用 aarch64……

一直修改到

LDFLAGS=-static ./configure --without-x --with-sound=no --without-lcms2 --without-libsystemd

还是有大量出错,然后有点看不懂了……

@luhui 提出的 guix 方案比较可行。

可行!

ERROR: ld.so: object '/$LIB/libonion.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.

这种错误应该可以忽略?

看样子不属于guix管,应该可以忽略