The problem is this. I have to build gpgme on linux because there is no binary distribution with the gpgmepp and qgpgme bits, and the autoconf buildsystem is incompatible with windows (I tried building with msys2, but the awk scripts in gpg-error already fail with msys2 awk).
After a bunch of tinkering I managed to build a x86_64 version of gpgme, which I the copied over to the windows system and tried to link against it.
However there seems to be a problem with the name mangling (https://en.wikipedia.org/wiki/Name_mangling)
It looks like clang-cl expects msvc style name mangling, but the dll contains clang/gcc style name mangling and that doesn't work.
At first I thought it has to do with the calling convention (the /Gr flag implies fastcall), but it it seems to correctly expect _cdecl (at least I think that's correct), so I'm not sure how this is supposed to work.
Extra links:
- http://unixwiz.net/techtips/win32-callconv.html
- https://en.wikipedia.org/wiki/X86_calling_conventions
- https://www.transmissionzero.co.uk/computing/building-dlls-with-mingw/
The linker error:
2715 warnings generated. [10/53] Linking CXX static library lib\mailcrypto.lib^M mocs_compilation.cpp.obj : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library^M [11/53] Automatic MOC for target kubeframework^M [12/52] Linking CXX shared library bin\kubeframework.dll^M FAILED: bin/kubeframework.dll lib/kubeframework.lib ^M cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_dll --intdir=framework\src\CMakeFiles\kubeframework.dir --manifests -- C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1412~1.258\bin\Hostx64\x64\link.exe /nologo framework\src\CMakeFiles\kubeframework.dir\settings\settings.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\maillistmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\folderlistmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\perioddayeventmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\composercontroller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\modeltest.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\retriever.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\outboxmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\identitiesmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\recepientautocompletionmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\settings\accountsettings.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\selector.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\completer.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mouseproxy.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\contactcontroller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\controller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\peoplemodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\textdocumenthandler.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\htmlutils.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\messageparser.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\attachmentmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\partmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\mailtemplates.cpp.obj framework\src\CMakeFiles\kubeframework.dir\accounts\accountfactory.cpp.obj framework\src\CMakeFiles\kubeframework.dir\accounts\accountsmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\fabric.cpp.obj framework\src\CMakeFiles\kubeframework.dir\sinkfabric.cpp.obj framework\src\CMakeFiles\kubeframework.dir\kubeimage.cpp.obj framework\src\CMakeFiles\kubeframework.dir\clipboardproxy.cpp.obj framework\src\CMakeFiles\kubeframework.dir\krecursivefilterproxymodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\webengineprofile.cpp.obj framework\src\CMakeFiles\kubeframework.dir\startupcheck.cpp.obj framework\src\CMakeFiles\kubeframework.dir\keyring.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domainobjectcontroller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\extensionmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\viewhighlighter.cpp.obj framework\src\CMakeFiles\kubeframework.dir\kubeframework_autogen\mocs_compilation.cpp.obj /out:bin\kubeframework.dll /implib:lib\kubeframework.lib /pdb:bin\kubeframework.pdb /dll /version:0.0 -Wl,--no-undefined -Wl,--fatal-warnings /machine:x64 /debug /INCREMENTAL C:\Users\User\CraftRoot\lib\sink.lib lib\kube_otp.lib lib\mailcrypto.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebEngineWidgets.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Test.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebEngine.lib C:\Users\User\CraftRoot\lib\KF5Contacts.lib C:\Users\User\CraftRoot\lib\KAsync.lib C:\Users\User\CraftRoot\lib\libqgpgme.dll.a C:\Users\User\CraftRoot\lib\libgpgmepp.dll.a C:\Users\User\CraftRoot\lib\KF5CoreAddons.lib C:\Users\User\CraftRoot\lib\pthreads.lib C:\Users\User\CraftRoot\lib\libgpgme.dll.a C:\Users\User\CraftRoot\lib\libassuan.dll.a C:\Users\User\CraftRoot\lib\libgpg-error.dll.a C:\Users\User\CraftRoot\lib\KF5Mime.lib C:\Users\User\CraftRoot\lib\KF5Codecs.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5PrintSupport.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Widgets.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebEngineCore.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Quick.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Gui.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebChannel.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Qml.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Network.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Positioning.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Core.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."^M LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1412~1.258\bin\Hostx64\x64\link.exe /nologo framework\src\CMakeFiles\kubeframework.dir\settings\settings.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\maillistmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\folderlistmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\perioddayeventmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\composercontroller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\modeltest.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\retriever.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\outboxmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\identitiesmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\recepientautocompletionmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\settings\accountsettings.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\selector.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\completer.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mouseproxy.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\contactcontroller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\controller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\peoplemodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\textdocumenthandler.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\htmlutils.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\messageparser.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\attachmentmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\partmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domain\mime\mailtemplates.cpp.obj framework\src\CMakeFiles\kubeframework.dir\accounts\accountfactory.cpp.obj framework\src\CMakeFiles\kubeframework.dir\accounts\accountsmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\fabric.cpp.obj framework\src\CMakeFiles\kubeframework.dir\sinkfabric.cpp.obj framework\src\CMakeFiles\kubeframework.dir\kubeimage.cpp.obj framework\src\CMakeFiles\kubeframework.dir\clipboardproxy.cpp.obj framework\src\CMakeFiles\kubeframework.dir\krecursivefilterproxymodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\webengineprofile.cpp.obj framework\src\CMakeFiles\kubeframework.dir\startupcheck.cpp.obj framework\src\CMakeFiles\kubeframework.dir\keyring.cpp.obj framework\src\CMakeFiles\kubeframework.dir\domainobjectcontroller.cpp.obj framework\src\CMakeFiles\kubeframework.dir\extensionmodel.cpp.obj framework\src\CMakeFiles\kubeframework.dir\viewhighlighter.cpp.obj framework\src\CMakeFiles\kubeframework.dir\kubeframework_autogen\mocs_compilation.cpp.obj /out:bin\kubeframework.dll /implib:lib\kubeframework.lib /pdb:bin\kubeframework.pdb /dll /version:0.0 -Wl,--no-undefined -Wl,--fatal-warnings /machine:x64 /debug /INCREMENTAL C:\Users\User\CraftRoot\lib\sink.lib lib\kube_otp.lib lib\mailcrypto.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebEngineWidgets.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Test.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebEngine.lib C:\Users\User\CraftRoot\lib\KF5Contacts.lib C:\Users\User\CraftRoot\lib\KAsync.lib C:\Users\User\CraftRoot\lib\libqgpgme.dll.a C:\Users\User\CraftRoot\lib\libgpgmepp.dll.a C:\Users\User\CraftRoot\lib\KF5CoreAddons.lib C:\Users\User\CraftRoot\lib\pthreads.lib C:\Users\User\CraftRoot\lib\libgpgme.dll.a C:\Users\User\CraftRoot\lib\libassuan.dll.a C:\Users\User\CraftRoot\lib\libgpg-error.dll.a C:\Users\User\CraftRoot\lib\KF5Mime.lib C:\Users\User\CraftRoot\lib\KF5Codecs.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5PrintSupport.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Widgets.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebEngineCore.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Quick.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Gui.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5WebChannel.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Qml.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Network.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Positioning.lib C:\Qt\5.9.5\msvc2017_64\lib\Qt5Core.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:framework\src\CMakeFiles\kubeframework.dir/intermediate.manifest framework\src\CMakeFiles\kubeframework.dir/manifest.res" failed (exit code 1120) with the following output: LINK : warning LNK4044: unrecognized option '/Wl,--no-undefined'; ignored^M LINK : warning LNK4044: unrecognized option '/Wl,--fatal-warnings'; ignored^M LINK : warning LNK4044: unrecognized option '/Wl,--no-undefined'; ignored^M LINK : warning LNK4044: unrecognized option '/Wl,--fatal-warnings'; ignored^M mailcrypto.lib(mailcrypto.cpp.obj) : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class GpgME::Context * __cdecl GpgME::Context::createForProtocol(enum GpgME::Protocol)" (__imp_?createForProtocol@Context@GpgME@@SAPEAV12@W4Protocol@2@@Z) referenced in function "class Expected<struct MailCrypto::Error,class QByteArray> __cdecl exportPublicKey(struct MailCrypto::Key const &)" (?exportPublicKey@@YA?AV?$Expected@UError@MailCrypto@@VQByteArray@@@@AEBUKey@MailCrypto@@@Z)^M mailcrypto.lib(mailcrypto.cpp.obj) : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl GpgME::Context::setArmor(bool)" (__imp_?setArmor@Context@GpgME@@QEAAX_N@Z) referenced in function "class Expected<struct MailCrypto::Error,class QByteArray> __cdecl exportPublicKey(struct MailCrypto::Key const &)" (?exportPublicKey@@YA?AV?$Expected@UError@MailCrypto@@VQByteArray@@@@AEBUKey@MailCrypto@@@Z)^M bin\kubeframework.dll : fatal error LNK1120: 2 unresolved externals^M
This is what we find in the dll.a (using objdump.exe /SYMBOLS)
COFF SYMBOL TABLE 000 00000000 SECT1 notype Static | .text 001 00000000 SECT2 notype Static | .idata$7 002 00000000 SECT3 notype Static | .idata$5 003 00000000 SECT4 notype Static | .idata$4 004 00000000 SECT5 notype Static | .idata$6 005 00000000 SECT1 notype External | _ZN5GpgME7Context17createForProtocolENS_8ProtocolE 006 00000000 SECT3 notype External | __imp__ZN5GpgME7Context17createForProtocolENS_8ProtocolE 007 00000000 UNDEF notype External | _head_libgpgmepp_6_dll