Windows: Linking against Ggpemepp and QGpgme.
Closed, ResolvedPublic

Description

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:

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
cmollekopf triaged this task as Normal priority.

So the solution would be to ensure a .def file is generated (-Wl,--output-def,testdll.def)

And then using that .def file to generate a .lib file like so: "lib /machine:x64 /def:testdll.def"

Haven't tried it but htat's the theory I think.

Anyways, I'm just going to port to the C library instead.

cmollekopf closed this task as Resolved.May 29 2018, 7:23 PM
cmollekopf claimed this task.

Ported to gpgme