代码之家  ›  专栏  ›  技术社区  ›  Kingsley

如何使用AppImageTool创建在旧Linux上运行的包

  •  0
  • Kingsley  · 技术社区  · 4 年前

    我试着用 appimagetool ( https://appimage.org/ )创建OCR程序的单个二进制可执行文件 tesseract https://github.com/tesseract-ocr ). 我已经在Ubuntu19.10上构建了tesseract,我希望这个可执行文件能在Ubuntu14.01上运行。

    我不能控制旧版本的Ubuntu,我需要最新版本的tesseract的特性。我已经尝试了tesseract的一个现有AppImage,它的失败方式与下面详述的类似。

    https://appiomatic.com/blog/creating-appimage-binary-manually-for-linux-from-your-app/ 我创造了一个 tesseract.AppDir 具有必要的布局:

    tesseract.AppDir/AppRun
    tesseract.AppDir/.DirIcon
    tesseract.AppDir/tesseract.desktop
    tesseract.AppDir/tesseract.png
    tesseract.AppDir/usr
    tesseract.AppDir/usr/bin
    tesseract.AppDir/usr/bin/tesseract
    tesseract.AppDir/usr/lib
    tesseract.AppDir/usr/lib/libtesseract.so.5
    tesseract.AppDir/usr/lib/libtesseract.so.5.0.0
    ...
    tesseract.AppDir/usr/share
    tesseract.AppDir/usr/share/tessdata
    tesseract.AppDir/usr/share/tessdata/eng.traineddata
    ...
    tesseract.AppDir/usr/share/tessdata/tessconfigs
    ...
    

    并创建了AppImage:

    [Ubuntu 19.10]$ ~/Downloads/appimagetool-x86_64.AppImage tesseract.AppDir
    appimagetool, continuous build (commit effcebc), build 2084 built on 2019-05-01 21:02:41 UTC
    Using architecture x86_64
    /home/kingsley/Software/Tesseract/tesseract/tesseract.AppDir should be packaged as Tesseract-OCR-x86_64.AppImage
    Generating squashfs...
    Parallel mksquashfs: Using 6 processors
    Creating 4.0 filesystem on Tesseract-OCR-x86_64.AppImage, block size 131072.
    [=======================================================================================================================|] 1921/1921 100%
    
    Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072
        compressed data, compressed metadata, compressed fragments, compressed xattrs
        duplicates are removed
    Filesystem size 73511.40 Kbytes (71.79 Mbytes)
        30.95% of uncompressed filesystem size (237490.75 Kbytes)
    Inode table size 5971 bytes (5.83 Kbytes)
        57.29% of uncompressed inode table size (10423 bytes)
    Directory table size 1019 bytes (1.00 Kbytes)
        56.90% of uncompressed directory table size (1791 bytes)
    Number of duplicate files found 0
    Number of inodes 92
    Number of files 78
    Number of fragments 5
    Number of symbolic links  3
    Number of device nodes 0
    Number of fifo nodes 0
    Number of socket nodes 0
    Number of directories 11
    Number of ids (unique uids + gids) 1
    Number of uids 1
        root (0)
    Number of gids 1
        root (0)
    Embedding ELF...
    Marking the AppImage as executable...
    Embedding MD5 digest
    Success
    

    libpng16.so.16 .

    [Ubuntu14]$ ./Tesseract-OCR-x86_64.AppImage 
    tesseract: error while loading shared libraries: libpng16.so.16: cannot open shared object file: No such file or directory
    
    

    进一步的研究使我相信我必须手动复制所有依赖项。

    所以使用 ldd

    [Ubuntu 19.10]$ ldd LOCAL_INSTALL/bin/tesseract 
        linux-vdso.so.1 (0x00007fffd7937000)
        libtesseract.so.5 => not found
        liblept.so.5 => /usr/lib/x86_64-linux-gnu/liblept.so.5 (0x00007f44c03d3000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f44c03b0000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f44c01c2000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f44c01a8000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f44bffb7000)
        libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f44bff7d000)
        libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f44bfef8000)
        libgif.so.7 => /usr/lib/x86_64-linux-gnu/libgif.so.7 (0x00007f44bfeed000)
        libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f44bfe6c000)
        libwebp.so.6 => /usr/lib/x86_64-linux-gnu/libwebp.so.6 (0x00007f44bfc03000)
        libopenjp2.so.7 => /usr/lib/x86_64-linux-gnu/libopenjp2.so.7 (0x00007f44bfbad000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f44bfa5c000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f44bfa40000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f44c0706000)
        libzstd.so.1 => /usr/lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f44bf999000)
        liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f44bf972000)
        libjbig.so.0 => /usr/lib/x86_64-linux-gnu/libjbig.so.0 (0x00007f44bf764000)
    

    tesseract.AppDir/usr/lib/ 再次重建了AppImage。

    在Ubuntu 14上测试仍然失败:

    [Ubuntu14]$ ./Tesseract-OCR-x86_64.AppImage 
    Segmentation fault (core dumped)
    Segmentation fault (core dumped)
    Segmentation fault (core dumped)
    Segmentation fault (core dumped)
    

    libc.so.6

    tesseract: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.22' not found (required by /tmp/.mount_Tesser6wDkZB/lib/liblept.so.5)
    

    liblept.so.5 这就是问题所在。

    现在我几乎没有主意了。

    1. AppImages的用例?
    2. 有没有办法调试出了什么问题?
    3. 是否有自动查找依赖项的工具?
    4. Ubuntu 14.01只是 gocr .
    0 回复  |  直到 4 年前
        1
  •  1
  •   Alexis    4 年前

    这不是AppImages的用例吗?

    这无疑是一个有效的用例。

    是的,你可以用 strace LD_DEBUG=libs 环境变量以查看正在加载的内容。有关调试AppImages的详细信息,请检查:

    是否有自动查找依赖项的工具?

    https://github.com/AppImage/awesome-appimage#build-systems

    你应该使用哪一个取决于你的应用程序是否可以建立在最古老稳定的系统上。如果答案是肯定的,你可以用 linuxdeploy appmage-builder . 我建议你读书 this entry

    ubuntu14.01是不是太老了,我应该放弃使用gocr。

    可以证明,你可以使用 appimage-builder 在ubuntu20.04中构建AppImage。

        2
  •  0
  •   Kingsley    4 年前

    如果有人在这里寻找如何真正解决这个问题,我就是这样解决的。

    通过逐个添加库,我能够确定问题的核心是 liblept.so.5 是用glibc22.2编译的,而ubuntu14目标没有这个。我发现这是 只有 有这个问题的图书馆。

    但是简单地包括 libc.so.6 也造成了所有的分割错误。我不知道为什么-我还是想知道 为什么? . 所以我四处寻找替代品。

    我尝试的一种方法是编译tesseract以链接静态liblept,但这并没有立即起作用,我也没有时间对其进行全面的研究。也许这是个好办法。最后我考虑编译一个本地的leptonica库,这样就有了一个本地的ubuntu14版本的.so,而App Image就可以使用它了。

    显然,这不是最好的解决方案,因为它没有包含在包中,但这足以让它为我工作。