LoginSignup
0
0

More than 5 years have passed since last update.

GPGme with Qt5

Last updated at Posted at 2017-02-17

GPGを任意のプログラムから呼び出すことができるGPGmeのconfigureにQt5のオプションがあることに気が付きました。

何ができるのかよく分かりませんが、とりあえず有効にしてみようとして四苦八苦したので備忘録。

環境

  • Ubuntu 16.04 LTS
  • Qt 5.8
  • GPGme 1.8 (f06220b (61538))
        GPGME v1.8.0 has been configured as follows:

        Revision:          f06220b  (61538)
        Platform:          x86_64-pc-linux-gnu

        UI Server:         yes
        FD Passing:        yes

        Language bindings: cl cpp  qt

Qt5

Qt5をUbuntuにインストールすると、デフォルトでは/opt/Qtにインストールされます。

諸々は/opt/Qt/5.8/gcc_64などにありますが、普段はqmakeが何でもやってくれるので、configureに渡すにはどうしたらいいのか途方に暮れます。

まずpkgconfigでQt5Core.pcが無いよ!って怒られますので、ln -s /opt/Qt/5.8/gcc_64/lib/pkgconfig/*.pc /usr/local/lib/pkgconfig/します。

以下のパラメータでconfigureは通ります。

MOC=/opt/Qt/5.8/gcc_64/bin/moc \
    GPGME_QT_CFLAGS="-I/opt/Qt/5.8/gcc_64/include -I/opt/Qt/5.8/gcc_64/include/QtCore" \
    GPGME_QT_LIBS="-lQt5Core -L/opt/Qt/5.8/gcc_64/lib -Wl,-rpath /opt/Qt/5.8/gcc_64/lib" \
    ./configure

make

makeを実行すると、次のようなエラーが出ます。

...
libtool: link: g++  -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginS.o  .libs/dataprovider.o .libs/job.o .libs/multideletejob.o .libs/qgpgmeadduseridjob.o .libs/qgpgmebackend.o .libs/qgpgmechangeexpiryjob.o .libs/qgpgmechangeownertrustjob.o .libs/qgpgmechangepasswdjob.o .libs/qgpgmedecryptjob.o .libs/qgpgmedecryptverifyjob.o .libs/qgpgmedeletejob.o .libs/qgpgmedownloadjob.o .libs/qgpgmeencryptjob.o .libs/qgpgmeexportjob.o .libs/qgpgmeimportfromkeyserverjob.o .libs/qgpgmeimportjob.o .libs/qgpgmekeygenerationjob.o .libs/qgpgmekeylistjob.o .libs/qgpgmelistallkeysjob.o .libs/qgpgmenewcryptoconfig.o .libs/qgpgmerefreshkeysjob.o .libs/qgpgmesecretkeyexportjob.o .libs/qgpgmesignencryptjob.o .libs/qgpgmesignjob.o .libs/qgpgmesignkeyjob.o .libs/qgpgmeverifydetachedjob.o .libs/qgpgmeverifyopaquejob.o .libs/threadedjobmixin.o .libs/qgpgmekeyformailboxjob.o .libs/gpgme_backend_debug.o .libs/qgpgmetofupolicyjob.o .libs/defaultkeygenerationjob.o .libs/qgpgmewkspublishjob.o .libs/dn.o   -Wl,-rpath -Wl,/home/mugwort_rc/Downloads/gpgme-1.8.0-3/gpgme-1.8.0/lang/cpp/src/.libs -Wl,-rpath -Wl,/home/mugwort_rc/Downloads/gpgme-1.8.0-3/gpgme-1.8.0/src/.libs -Wl,-rpath -Wl,/opt/Qt/5.8/gcc_64/lib -Wl,-rpath -Wl,/opt/Qt/5.8/gcc_64/lib ../../cpp/src/.libs/libgpgmepp.so ../../../src/.libs/libgpgme.so -lassuan -L/usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/libgpg-error.so /opt/Qt/5.8/gcc_64/lib/libQt5Core.so -L/opt/Qt/5.8/gcc_64/lib -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/5/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o  -O2 -Wl,-rpath   -Wl,-soname -Wl,libqgpgme.so.7 -o .libs/libqgpgme.so.7.1.0
/usr/bin/ld: cannot find libqgpgme.so.7: No such file or directory
collect2: error: ld returned 1 exit status
...

libqgpgme.soを作るコマンドでlibqgpgme.so.7を必要としているみたいです?

よく見るとlibtoolが怪しいです。(-Wl,-soname -Wl,libqgpgme.so.7

ルートディレクトリ(configureと同じディレクトリ)にあるlibtoolの\${wl}-soname \$wl\$soname -o \$libとなっているところを、\${wl}-soname=\$soname -o \$libとします。

--- a/libtool   2017-02-17 23:31:33.476642000 +0900
+++ b/libtool   2017-02-17 23:32:51.476700473 +0900
@@ -10157,7 +10157,7 @@
 old_archive_from_expsyms_cmds=""

 # Commands used to build a shared archive.
-archive_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib"
+archive_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname=\$soname -o \$lib"
 archive_expsym_cmds="\$CC \$pic_flag -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib"

 # Commands used to build a loadable module if different from building

おそらくこれで問題なくビルドが通るはずです。(少なくともgpgme1.8では…。)

Python

ついでにPython wrapper(PyME)もインストールします。

  • Python 3.5
  • virtualenv
  • SWIG 3.0.12

lang/pythonに移動します。

setup.py buildを行うと、まずconfig.hが無いと怒られるのでln -s ../../config.hを行います。

次にdata.hが無いと怒られるので、setup.pyを開き、include_dirsに../../src/を追加します。

--- a/setup.py  2017-02-18 00:01:47.810115922 +0900
+++ b/setup.py  2017-02-18 00:01:44.225997126 +0900
@@ -28,7 +28,7 @@
 gpgme_config_flags = ["--thread=pthread"]
 gpgme_config = ["gpgme-config"] + gpgme_config_flags
 gpgme_h = ""
-include_dirs = [os.getcwd()]
+include_dirs = [os.getcwd(), "../../src/"]
 library_dirs = []
 in_tree = False
 extra_swig_opts = []

後はsetup.py buildsetup.py installでvirtualenv上にgpgライブラリが追加されます。

参照: pyme備忘録

QGpgME

QIODeviceDataProvider

GPGmeにデータを渡す際、毎回QIODevice::readAll()してQByteArray::constData()を取得するのは面倒ですし、スマートではありません。

GPGmeにはDataProviderというのが用意されており、任意のデータソースを読み書きする手段となります。

std::shared_ptr<QIODevice> file(new QFile(filepath));
if ( ! file->open(QIODevice::ReadOnly) ) {
    return;
}

QGpgME::QIODeviceDataProvider provider(file);
GpgME::Data data(&provider);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0