为另一台服务器编译 gawk 可执行文件

Compile gawk executable for another server

我有一个服务器,我无法直接编译某些处理所需的 gawk 版本。所以我试图找出如何在另一个平台上编译它并将可执行文件传输到服务器并在那里执行它。我尝试将现有的 gawk 从我的笔记本电脑的发行版 (Linux Mint) 复制到服务器 (Redhat),但它没有必要的库,至少在可执行文件寻找它们的地方没有。

$ ./gawk --version
./gawk: error while loading shared libraries: libsigsegv.so.2: cannot open shared object file: No such file or directory

有没有标准的方法来编译像 gawk 这样的程序,使其不依赖外部库(我想几乎像 AppImage)?由于 gawk 使用 make 进行安装,我希望我可以在那里设置一些选项。

非常感谢您在对我的原文 post 的评论中提供的帮助。下面是它最终如何工作的总结。我看到 make 导致以下内容作为创建 gawk 可执行文件的最终编译命令:

gcc -std=gnu99  -g -O2 -DNDEBUG  -L/usr/lib64//lib -o gawk array.o awkgram.o builtin.o cint_array.o command.o debug.o eval.o ext.o field.o floatcomp.o gawkapi.o gawkmisc.o int_array.o io.o main.o mpfr.o msg.o node.o profile.o re.o replace.o str_array.o symbol.o version.o support/libsupport.a -lmpfr -lgmp -ldl -lm 

所以我修改了 gcc 命令如下:

下载并编译 mpfr 库(仅 ./configuremake)。 下载并编译 gmp 库(仅 ./configuremake)。 下载编译gawk-4.2.1.

./configure
make
gcc -std=gnu99  -g -O2 -DNDEBUG  -L/usr/lib64//lib -o gawk array.o awkgram.o builtin.o cint_array.o command.o debug.o eval.o ext.o field.o floatcomp.o gawkapi.o gawkmisc.o int_array.o io.o main.o mpfr.o msg.o node.o profile.o re.o replace.o str_array.o symbol.o version.o support/libsupport.a  -Bstatic -L /home/osboxes/Downloads/mpfr-4.0.1/src/.libs/ -l:libmpfr.a -L /home/osboxes/Downloads/gmp-6.1.2/.libs/ -l:libgmp.a -Bdynamic -ldl -lm 

这导致了一个具有 mpfr 和 gmp 库静态链接的 gawk 可执行文件,因此当我将它传输到尚未安装 libmpfr.so 的服务器时,它能够使用静态库执行。

添加静态库之前:

[osboxes@osboxes Gawk]$ ldd gawk
    linux-vdso.so.1 =>  (0x00007ffe17750000)
    libmpfr.so.4 => /lib64/libmpfr.so.4 (0x00007fca2042d000)
    libgmp.so.10 => /lib64/libgmp.so.10 (0x00007fca201b5000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fca1ffb1000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fca1fcaf000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fca1f8e2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fca20688000)

添加静态库后:

[osboxes@osboxes gawk-4.2.1]$ ldd gawk
    linux-vdso.so.1 =>  (0x00007fff1b8d5000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f69363b0000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f69360ae000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6935ce1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f69365b4000)

Is there a standard way to compile a program like gawk such that it does not rely on external libraries (almost like an AppImage I suppose)?

为什么不做一个 AppImage 呢?