【问题标题】:Static linked vips (libvips) binary静态链接 vips (libvips) 二进制文件
【发布时间】:2016-09-26 23:44:24
【问题描述】:

我一直在尝试创建一个静态链接版本的 vips,但一直未能成功。是否可以创建静态链接的vips命令?

我正在编译的平台是 Ubuntu 16.04。

我正在运行的 make 命令:

 make LDFLAGS=-all-static

我没有将它配置为使用 python 或 imagemagick,(那些在配置输出中显示“否”)。我得到的错误是:

/usr/bin/ld: cannot find -lgdk_pixbuf-2.0
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgio-2.0.a(libgio_2_0_la-glocalfileinfo.o): In function `lookup_gid_name':
(.text+0x11d7): warning: Using 'getgrgid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgio-2.0.a(libgio_2_0_la-glocalvfs.o): In function `g_local_vfs_parse_name':
(.text+0x1cd): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libglib-2.0.a(libglib_2_0_la-gutils.o): In function `g_get_user_database_entry':
(.text+0x249): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libglib-2.0.a(libglib_2_0_la-gutils.o): In function `g_get_user_database_entry':
(.text+0xcf): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgio-2.0.a(libgio_2_0_la-glocalfileinfo.o): In function `lookup_uid_data':
(.text+0x1054): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libxml2.a(nanohttp.o): In function `xmlNanoHTTPConnectHost':
(.text+0x924): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libxml2.a(nanohttp.o): In function `xmlNanoHTTPConnectHost':
(.text+0x9f4): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgio-2.0.a(libgio_2_0_la-gnetworkaddress.o): In function `g_network_address_parse':
(.text+0xc39): warning: Using 'getservbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libgio-2.0.a(libgio_2_0_la-gnetworkaddress.o): In function `g_network_address_parse':
(.text+0xc4e): warning: Using 'endservent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
collect2: error: ld returned 1 exit status
Makefile:597: recipe for target 'vips' failed
make[2]: *** [vips] Error 1
make[2]: Leaving directory '/usr/local/src/vips-8.4.1/tools'
Makefile:631: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/usr/local/src/vips-8.4.1'
Makefile:536: recipe for target 'all' failed
make: *** [all] Error 2

根据我发现的内容,例如这里: Create statically-linked binary that uses getaddrinfo? 这是 libnss 的问题吗?但是在 ./configure --help 输出中没有 --enable-static-flag。即便如此,我也试过了,但并没有解决我的问题。

我要链接的库(根据配置输出,我已将其截断):

build radiance support:         yes
build analyze support:          yes
build PPM support:          yes
use fftw3 for FFT:          yes
accelerate loops with orc:      yes
ICC profile support with lcms:      yes (lcms2)
SVG import with librsvg-2.0:        yes
zlib:                   yes
file import/export with libwebp:    yes
file import/export with libpng:     yes (pkg-config libpng >= 1.2.9)
file import/export with libtiff:    yes (pkg-config libtiff-4)
file import/export with giflib:     yes (found by search)
file import/export with libjpeg:    yes
use libexif to load/save JPEG metadata: yes

我链接的特定库是否会导致问题?

【问题讨论】:

    标签: static-libraries vips


    【解决方案1】:

    在无法说服构建机制进行静态链接后,在将an issue 报告给 staticx 并看到它已修复后,我能够使用staticx 成功创建一个工作静态vips 可执行文件。请参阅 here 了解我的构建方式。

    以防万一将来地雷链接失效,以下是相关部分:

    RUN curl -sL https://github.com/libvips/libvips/releases/download/v8.9.2/vips-8.9.2.tar.gz | tar -xz -f- --strip-components=1 -C .
    
    # TODO: Add --disable-deprecated
    # Blocked by https://github.com/libvips/libvips/pull/1593
    
    # XXX: -static doesn't work here, I'm using staticx to make the final vips binary static.
    RUN CFLAGS="-O3 -flto -pipe" CXXFLAGS="-O3 -flto -pipe" \
        ./configure \
            --disable-shared \
            --disable-static \
            --disable-dependency-tracking
    
    # This is the fastest easiest way I found to compile the
    # CLI as fast as possible. You can probably get more optimal,
    # but it'd be a lot harder wrestling autotools.
    RUN cd libvips \
        && make -j"$(nproc)"
    RUN cd tools \
        && make -j"$(nproc)" vips
    
    RUN cd tools \
        && staticx vips ../vips
    

    由于自动配置功能检测,这里是我安装的 Debian 10(6 月 22 日)软件包:

        libglib2.0-dev \
        libexpat1-dev \
        libjpeg-dev \
        libpng-dev \
        libimagequant-dev \
        libexif-dev \
        liborc-0.4-dev
    

    它重 330 万,令人印象深刻,而且比分发包小得多,这就是我一开始就着手做这件事的原因。

    $ file vips-glibc-gcc
    vips-glibc-gcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
    $ ls -lah vips-glibc-gcc
    -rwxr-xr-x 1 josh josh 3.3M Jun 23 02:51 vips-glibc-gcc
    

    【讨论】:

      【解决方案2】:

      我试过这样:

      $ CFLAGS="-static" CXXFLAGS="-static" ./configure --prefix=/home/john/vips --without-python --without-magick
      

      而且它似乎有效:

      $ ls ~/vips/lib
      girepository-1.0  libvipsCC.a   libvips-cpp.a   libvips.la  python2.7
      libvips.a         libvipsCC.la  libvips-cpp.la  pkgconfig
      $ which vips
      /home/john/vips/bin/vips
      $ ls -l ~/vips/bin/vips
      -rwxr-xr-x 1 john john 6373864 Sep 27 13:16 /home/john/vips/bin/vips
      $ vips invert /data/john/pics/k2.jpg x.jpg
      $ eog x.jpg
      

      不过,我没有对其进行太多测试,而且我怀疑它不是很静态。例如,如果您在 vips 二进制文件上运行 ldd,您会得到一个长列表。真正的静态二进制文件不再存在。

      为什么需要静态二进制文件?如果是为了简化分发,像 flatpack 和 snappy 这样的东西可能会更好。您也可以自己制作 --- 例如,vips 带有一个简单的包装脚本,可以使共享的二进制文件可重定位。

      【讨论】:

      • 我希望将它部署在一个极简的 docker 容器中,该容器还具有 ffmpeg 和 ffprobe 的静态版本。我想我只是不确定为什么图像转换程序需要像 getservbyname 这样的调用,所以希望我可以放弃一些依赖。
      • vips 使用 glib 来帮助可移植性,而 glib 中有很多东西。您可以尝试制作自己的 glib 并删除一些东西,这可能会有所帮助。我认为静态二进制 ^^^^ 可以在任何 16.04 安装中使用,这是可以的,但它可能不适用于非常小的 linux 安装。 OpenWRT 有一个 libvips 包,它非常小,也许你可以适应它?
      • 我认为使用像 Dietlibc 这样的东西可能会奏效,但还没有机会重新访问它。
      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2011-02-13
      相关资源
      最近更新 更多