天天看点

如何在Linux上构建发布包含.so动态库的snap安装包

Linux上要发布源码包比较容易,只要做个压缩包.tar.gz就可以。但是如果要做一个包含库和可执行文件的安装包,就比较麻烦。Linux的版本很多,需要做不同格式的安装包,比如.deb和.rpm,同时还需要做很多测试。现在有了Snap这个包管理系统,就会方便很多。Snap支持所有主流的Linux系统。

如何在Linux上构建发布包含.so动态库的snap安装包

安装Snap和Snapcraft

按照官方指南进行安装。

这里是

Debian

安装的步骤:

$ sudo apt update
$ sudo apt install snapd
$ sudo snap install snapcraft –classic
           

注意,WSL是不支持snapcraft安装的:

Interacting with snapd is not yet supported on Windows Subsystem for Linux.
This command has been left available for documentation purposes only.
           

我用了

Ubuntu 20.04

。安装后可以装一个

hello world

测试下:

$ sudo snap install hello-world
hello-world 6.4 from Canonical✓ installed
$ hello-world
Hello World!
           

使用Snapcraft构建发布Snap安装包

生成一个初始工程:

$ snapcraft init
Created snap/snapcraft.yaml.
           

接下来的示例我会用到Dynamsoft Barcode Reader。

下载 Dynamsoft Barcode Reader for Linux。从这个压缩包里取出

DynamsoftBarcodeReader.h

,

libDynamsoftBarcodeReader.so

,以及示例代码

ReadBarcode.cpp

创建

Makefile

文件:

CC=gcc
CCFLAGS=-c
 
LDFLAGS=-L ./lib
DBRLIB=-lDynamsoftBarcodeReader
 
STDLIB=-lstdc++
 
TARGET=barcode-reader
OBJECT=ReadBarcode.o
SOURCE=ReadBarcode.cpp
 
# build rule for target.
$(TARGET): $(OBJECT)
    $(CC) -o $(TARGET) $(OBJECT) $(STDLIB) $(DBRLIB) $(LDFLAGS)
 
# target to build an object file
$(OBJECT): $(SOURCE)
    $(CC) $(CCFLAGS) $(SOURCE)
 
install:
    mkdir -p $(DESTDIR)/usr/bin/
    cp ./barcode-reader $(DESTDIR)/usr/bin/
    mkdir -p $(DESTDIR)/usr/lib
    cp ./lib/libDynamsoftBarcodeReader.so $(DESTDIR)/usr/lib
 
# the clean target
.PHONY : clean
clean: 
    rm -f $(OBJECT) $(TARGET)
           

这里面最重要的是

install

。要把库文件和生成的可执行文件拷贝到对应的目录里。

编辑

snapcraft.yaml

文件:

name: barcode-reader 
base: core18 
version: '7.4' 
summary: Barcode SDK for 1D barcode, QR Code, Data Matrix, PDF417, Aztec Code, MaxiCode 
description: |
  An enterprise-class barcode SDK that enables you to efficiently embed barcode reading functionality in your web, desktop or mobile applications with a few lines of code.
icon: snap/gui/logo.png
grade: stable 
confinement: strict  
 
parts:
  barcode-reader:
    plugin: make
    build-packages: [gcc, g++, make]
    stage-packages: [libstdc++6]
    source: src
 
apps:
  barcode-reader:
    command: barcode-reader
    plugs: [home]
           

Snap安装包是在沙盒环境里运行的,所以需要指定权限。默认情况是不能读取系统里的文件的。添加

home

插件之后就可以从$HOME路径下读取文件。

编译安装包:

snapcraft
           

在本地安装进行测试:

sudo snap install --dangerous barcode-reader_7.4_amd64.snap
           

执行程序

barcode-reader ~/images/AllSupportedBarcodeTypes.tif 
           
如何在Linux上构建发布包含.so动态库的snap安装包

确认没有问题后,把安装包发布到Snap商店:

$ snapcraft login
$ snapcraft push --release=stable barcode-reader_7.4_amd64.snap
           

这是我的发布页面:https://snapcraft.io/barcode-reader.

最后,通过在线编辑美化页面。

如何在Linux上构建发布包含.so动态库的snap安装包

如何利用Snap包中的库文件创建Linux应用

安装Snap包:

$ sudo snap install barcode-reader
           

导出需要用的动态链接库:

$ export LD_LIBRARY_PATH=/snap/barcode-reader/current/usr/lib/
           

编译运行程序:

$ gcc -o app <source.cpp> -L /snap/barcode-reader/current/usr/lib/  -lDynamsoftBarcodeReader -lstdc++ 
$ ./app
           

也可以使用相对路径直接编译运行程序:

$ gcc -o app <source.cpp> -L /snap/barcode-reader/current/usr/lib/  -lDynamsoftBarcodeReader -lstdc++ -Wl,-rpath=/snap/barcode-reader/current/usr/lib/
$ ./app
           

源码

https://github.com/yushulx/snap-package

继续阅读