1. 如何用CMake构建deb包
CMake支持构建deb,rpm等形式的软件包,根据下面的cmakelist,就会生成一个简单的debian/control文件,如下。
SET(CPACK_GENERATOR "DEB")
SET(CPACK_PACKAGE_NAME "org.xzg.xweather")
SET(CPACK_PACKAGE_CONTACT "blueshaw@163.com")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "blueshaw")
SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "A simple weather app")
SET(CPACK_DEBIAN_PACKAGE_VERSION ${PACKAGE_VERSION})
SET(CPACK_DEBIAN_PACKAGE_PRIORITY "Optional")
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5widgets5, libqt5network5, libqt5gui5")
INCLUDE(CPack)
debian/control文件
Architecture: amd64
Depends: libqt5core5a, libqt5widgets5, libqt5network5, libqt5gui5
Description: A simple weather app
Maintainer: Xiao Zhiguo
Package: org.xzg.xweather
Priority: Optional
Section: devel
Version: 1.0.1
Installed-Size: 21254
如果你不赋值CPACK_DEBIAN_PACKAGE_DEPENDS这个变量,则在debian/control文件中,没有Depends这一行,虽然在你自己的机器上不影响打包构建。但是将deb包提供给他人安装后,可能无法运行。如果添加这一行,则可以在安装时就检查依赖是否满足。
2. 确定Depends依赖包
使用ldd查看可执行软件链接的动态库。
$ ldd xweather
linux-vdso.so.1 (0x00007ffdde71d000)
libQt5Widgets.so.5 => /lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007fb48ad0a000)
libQt5Gui.so.5 => /lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007fb48a77f000)
libQt5Network.so.5 => /lib/x86_64-linux-gnu/libQt5Network.so.5 (0x00007fb48a5de000)
libQt5Core.so.5 => /lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007fb48a0e3000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb489f5f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb489ddc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb489dc0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb489bff000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb489bde000)
libGL.so.1 => /lib/x86_64-linux-gnu/libGL.so.1 (0x00007fb489b4a000)
libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007fb489b11000)
libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007fb489a0e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb4899ef000)
libicui18n.so.63 => /lib/x86_64-linux-gnu/libicui18n.so.63 (0x00007fb489721000)
libicuuc.so.63 => /lib/x86_64-linux-gnu/libicuuc.so.63 (0x00007fb489556000)
libpcre2-16.so.0 => /lib/x86_64-linux-gnu/libpcre2-16.so.0 (0x00007fb4894db000)
libdouble-conversion.so.1 => /lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007fb4894c4000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb4894bf000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fb48939e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb48b389000)
libGLX.so.0 => /lib/x86_64-linux-gnu/libGLX.so.0 (0x00007fb48936a000)
libGLdispatch.so.0 => /lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007fb4892ad000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007fb4891f1000)
libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007fb4891c4000)
libicudata.so.63 => /lib/x86_64-linux-gnu/libicudata.so.63 (0x00007fb4877d2000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fb48775e000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007fb48761d000)
libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007fb487608000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fb4875de000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007fb4875d7000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fb4875cf000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007fb4875b5000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb4875ab000)
如果用Qt开发的应用,我们可以只关注Qt的库,使用grep过滤下。
$ ldd xweather | grep [Qq]t
libQt5Widgets.so.5 => /lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007ff241739000)
libQt5Gui.so.5 => /lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007ff2411ae000)
libQt5Network.so.5 => /lib/x86_64-linux-gnu/libQt5Network.so.5 (0x00007ff24100d000)
libQt5Core.so.5 => /lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007ff240b12000)
得到4个Qt的动态库,但是到这一步还没有结束,现在我们需要确定这些动态库都在哪些软件包里。
$ dpkg -S libQt5Widgets.so.5
libqt5widgets5:amd64: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.11
libqt5widgets5:amd64: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
libqt5widgets5:amd64: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.11.3
通过上面的步骤,我们就可以得到libQt5Widgets.so.5这个动态库在libqt5widgets5这个包中。同样的步骤,依次获取其他3个软件包名。
libqt5widgets5
libqt5gui5
libqt5network5
libqt5core5a
将这些软件包名赋值给CPACK_DEBIAN_PACKAGE_DEPENDS即可。
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libqt5core5a, libqt5widgets5, libqt5network5, libqt5gui5")
3 确定Build-Depends
后续的步骤是获取debian/control中Build-Depends的方法,记录下来,以备后用。
sudo apt-get install devscripts
The devscripts package provides a collection of scripts which may be of use to Debian developers and others wishing to build Debian packages.
要找出编译你的软件所需的软件包可以使用这个命令
$ dpkg-depcheck -d your_build_exec_binary
warning: files in /usr/local or /var/local used:
/usr/local/share/fonts/.uuid
The following files did not appear to belong to any package:
/usr/share/fonts/cMap/.uuid
/usr/lib/x86_64-linux-gnu/libdbus-1.so.3.19.13
/usr/share/fonts/deepin-font-install/.uuid
/usr/lib/x86_64-linux-gnu/libmount.so.1.1.0
/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
/usr/lib/x86_64-linux-gnu/libgcrypt.so.20.2.4
/usr/share/poppler/cMap/Adobe-Japan1/.uuid
/usr/share/fonts/truetype/unifont/.uuid
/usr/lib/x86_64-linux-gnu/libpthread-2.28.so
/usr/share/poppler/cMap/Adobe-Korea1/.uuid
/usr/lib/x86_64-linux-gnu/libsystemd.so.0.25.0
/usr/share/fonts/truetype/deepin/.uuid
/usr/lib/x86_64-linux-gnu/libnss_dns-2.28.so
/usr/share/fonts/X11/encodings/.uuid
/usr/share/fonts/X11/encodings/large/.uuid
/usr/share/fonts/cmap/.uuid
/usr/lib/x86_64-linux-gnu/libuuid.so.1.3.0
/usr/share/fonts/truetype/.uuid
/usr/share/fonts/truetype/lohit-devanagari/.uuid
/usr/lib/x86_64-linux-gnu/libcap.so.2.25
/usr/lib/x86_64-linux-gnu/libdl-2.28.so
/usr/share/fonts/X11/100dpi/.uuid
/usr/share/fonts/.uuid
/usr/lib/x86_64-linux-gnu/libz.so.1.2.11
/usr/lib/x86_64-linux-gnu/libc-2.28.so
/usr/lib/x86_64-linux-gnu/libgpg-error.so.0.26.1
/usr/share/fonts/X11/Type1/.uuid
/usr/lib/x86_64-linux-gnu/libresolv-2.28.so
/usr/share/fonts/truetype/ancient-scripts/.uuid
/usr/lib/x86_64-linux-gnu/libtinfo.so.6.1
/etc/resolv.conf
/usr/share/poppler/cMap/Adobe-GB1/.uuid
/usr/share/fonts/X11/75dpi/.uuid
/usr/share/fonts/truetype/dejavu/.uuid
/usr/share/fonts/X11/.uuid
/usr/share/fonts/X11/util/.uuid
/usr/share/mime/mime.cache
/usr/share/fonts/opentype/.uuid
/usr/share/poppler/cMap/Adobe-Japan2/.uuid
/usr/lib/x86_64-linux-gnu/libm-2.28.so
/usr/lib/x86_64-linux-gnu/libpcre.so.3.13.3
/etc/hosts
/usr/lib/locale/locale-archive
/etc/passwd
/usr/share/mime/image/png.xml
/usr/share/fonts/wps-office/.uuid
/usr/lib/x86_64-linux-gnu/libnss_files-2.28.so
/etc/nsswitch.conf
/usr/lib/x86_64-linux-gnu/libblkid.so.1.1.0
/usr/lib/x86_64-linux-gnu/libexpat.so.1.6.8
/usr/share/fonts/truetype/noto/.uuid
/usr/share/poppler/cMap/Adobe-CNS1/.uuid
/usr/lib/x86_64-linux-gnu/librt-2.28.so
/usr/lib/x86_64-linux-gnu/libwrap.so.0.7.6
/usr/share/fonts/opentype/noto/.uuid
/usr/share/fonts/X11/misc/.uuid
/usr/lib/x86_64-linux-gnu/libnsl-2.28.so
/usr/share/mime/types
/usr/lib/x86_64-linux-gnu/liblzma.so.5.2.4
/usr/lib/x86_64-linux-gnu/libselinux.so.1
Packages needed:
fonts-lohit-deva
deepin-default-settings
libqt5xdgiconloader3:amd64
libxcb-keysyms1:amd64
libdouble-conversion1:amd64
libvorbis0a:amd64
libjpeg62-turbo:amd64
libmtdev1:amd64
libx11-6:amd64
libqt5widgets5:amd64
libglvnd0:amd64
fcitx-frontend-qt5:amd64
libxcb-dri3-0:amd64
libpulse0:amd64
libcroco3:amd64
libxcb-dri2-0:amd64
libqt5xml5:amd64
libpcre2-16-0:amd64
libxcb1:amd64
libgdk-pixbuf2.0-0:amd64
libfontconfig1:amd64
libxcb-render0:amd64
libwebpdemux2:amd64
libglapi-mesa:amd64
libxcb-glx0:amd64
libice6:amd64
libxml2:amd64
libgl1-mesa-dri:amd64
fontconfig-config
deepin-image-viewer
libglx-mesa0:amd64
libdrm-amdgpu1:amd64
libxkbcommon-x11-0:amd64
locales
libxcb-composite0:amd64
libpixman-1-0:amd64
libcairo2:amd64
libgsettings-qt1:amd64
libffi6:amd64
libpango-1.0-0:amd64
qt5-image-formats-plugins:amd64
libxfixes3:amd64
libfribidi0:amd64
libxcb-present0:amd64
libedit2:amd64
libglib2.0-0:amd64
libxcb-xkb1:amd64
libpangoft2-1.0-0:amd64
fonts-dejavu-core
libsm6:amd64
libqt5svg5:amd64
qt5dxcb-plugin
libxkbcommon0:amd64
libdtkcore5:amd64
libasyncns0:amd64
libxxf86vm1:amd64
libqt5multimediawidgets5:amd64
libqt5multimedia5:amd64
libegl1:amd64
libxcb-randr0:amd64
libharfbuzz0b:amd64
dde-qt5integration
libqt5network5:amd64
libx11-data
deepin-icon-theme
libxcb-xinerama0:amd64
libraw19:amd64
libxcb-shm0:amd64
libgraphite2-3:amd64
libtiff5:amd64
librsvg2-2:amd64
fonts-noto-cjk
libxrender1:amd64
libmng1:amd64
libdrm-nouveau2:amd64
libqt5concurrent5:amd64
libdtkgui5:amd64
liblcms2-2:amd64
libwebp6:amd64
libxcb-xfixes0:amd64
libxau6:amd64
libxcb-sync1:amd64
libjbig0:amd64
libogg0:amd64
libxi6:amd64
libxcb-icccm4:amd64
libxtst6:amd64
libqt5dbus5:amd64
libxext6:amd64
libthai0:amd64
libxcb-util0:amd64
libsensors5:amd64
libqt5opengl5:amd64
libxcursor1:amd64
libvorbisenc2:amd64
libflac8:amd64
libgl1:amd64
libfreetype6:amd64
libllvm7:amd64
libpulse-mainloop-glib0:amd64
libzstd1:amd64
libqt5xdg3:amd64
libbsd0:amd64
libdatrie1:amd64
libxshmfence1:amd64
tzdata
libxcb-damage0:amd64
libqt5core5a:amd64
libx11-xcb1:amd64
libpangocairo-1.0-0:amd64
libicu63:amd64
libdrm2:amd64
libqt5x11extras5:amd64
ca-certificates
libxdmcp6:amd64
libxcb-image0:amd64
libdrm-radeon1:amd64
libc-l10n
dde-kwin
libsndfile1:amd64
libqt5gui5:amd64
libxcb-render-util0:amd64
libdtkwidget5:amd64
libglx0:amd64
libxcb-shape0:amd64
openssl
libpng16-16:amd64
libstartup-notification0:amd64
libxdamage1:amd64
libelf1:amd64
libdframeworkdbus2:amd64
libssl1.1:amd64
另一种方法可以执行
$ objdump -p your_build_exec_binary | grep NEEDED
NEEDED libQt5Widgets.so.5
NEEDED libQt5Gui.so.5
NEEDED libQt5Network.so.5
NEEDED libQt5Core.so.5
NEEDED libstdc++.so.6
NEEDED libm.so.6
NEEDED libgcc_s.so.1
NEEDED libc.so.6
通过上述两个办法获取到动态库后,执行下面的命令,获取开发包。
$ dpkg -S libQt5Network | grep dev
qtbase5-dev:amd64: /usr/lib/x86_64-linux-gnu/libQt5Network.so
填入到Build-Depends中即可。