Thanks for the valuable information everyone! I was able to put together a simple version of my Gtk3 application using Shawn's patch to `Heavy.pm`.
Some things are still broken because Gtk3 relies on other non-DLL files (such as icons, typelibs, and GSchema files which need to be placed in particular directories). I think I have hit upon a workable approach where I can use strace to get the list of files that my application actually uses. As for adding all the required non-DynaLoader DLLs, I believe it might be possible to create something that can automatically package the appropriate DLLs by taking the objdump or strace idea and creating a Perl version of Dependency Walker <http://www.dependencywalker.com/>. I will keep trying to get this all working in a way so that it is reproducible. My end goal is to have continuous delivery with nightly builds so that there are not any manual steps. Just thought I would ask: has anyone tried to distribute their Perl application using WiX <http://wixtoolset.org/> to create an MSI installer? Regards, - Zaki Mughal On 2016-06-14 at 14:47:49 +0000, RAPPAZ Francois wrote: > Hi there, > > To pack my Gtk2 applications, I set up the following on my Windows box: > > - pp -B --lib c:\strawberry\perl\vendor\lib > -l "C:\strawberry\perl\site\lib\auto\Cairo\Cairo.dll" > -l "C:\strawberry\perl\site\lib\auto\Pango\Pango.dll" > -l "C:\strawberry\perl\site\lib\auto\Glib\Glib.dll" > -l "C:\strawberry\perl\site\lib\auto\Gtk2\Gtk2.dll" > -o foo.par foo.pl > > - unzip the par files > > - removed the lib/auto/Gtk2, lib/auto/Cairo lib/auto/Pango from the par > unzipped directory > > - zipped all the directory tree back into foo.par > > - pp -o foo.exe foo.par > > I usually run this using a batch file and it works at the end. > > François > > > -----Original Message----- > > From: Zakariyya Mughal [mailto:zaki.mug...@gmail.com] > > Sent: lundi, 13. juin 2016 23:32 > > To: Roderich Schupp > > Cc: par@perl.org > > Subject: Re: Getting Gtk3 to work with PAR > > > > On 2016-06-13 at 23:09:06 +0200, Roderich Schupp wrote: > > > On Mon, Jun 13, 2016 at 9:54 PM, Zakariyya Mughal > > > <zaki.mug...@gmail.com> > > > wrote: > > > > > > > I notice that there is a similar issue > > > > <https://rt.cpan.org/Public/Bug/Display.html?id=55390> that was > > > > opened in 2010 for a Gtk2 program. > > > > > > > > > > > More relevant might be the thread on the par mailing list starting at > > > http://www.mail-archive.com/par%40perl.org/msg05011.html > > > > > > > > > > But when I run the test.exe, I get the following output: > > > > > > > > $ ./test.exe > > > > Can't load > > > > 'C:\msys64\tmp\par-7a616b69\cache- > > b75d584224b1a1061779c0bb91d380c83ae4a68e\79d2d23b.dll' > > > > for module Cairo::GObject: load_file:The specified module could not > > > > be found at C:/msys64/mingw64/lib/perl5/core_perl/DynaLoader.pm > > line 193. > > > > at C:/msys64/mingw64/lib/perl5/site_perl/PAR/Heavy.pm line > > 120. > > > > Compilation failed in require at Gtk3.pm line 47. > > > > > > > > > > Please run > > > > > > objdump -ax > > > C:\msys64\tmp\par-7a616b69\cache- > > b75d584224b1a1061779c0bb91d380c83ae4a > > > 68e\79d2d23b.dll > > > | grep "DLL Name" > > > > > > and post its output. > > > > $ objdump.exe -ax "C:\msys64\tmp\par-7a616b69\cache- > > b75d584224b1a1061779c0bb91d380c83ae4a68e\79d2d23b.dll" | grep "DLL > > Name" > > DLL Name: KERNEL32.dll > > DLL Name: msvcrt.dll > > DLL Name: libcairo-gobject-2.dll > > DLL Name: libcairo-2.dll > > DLL Name: libglib-2.0-0.dll > > DLL Name: perl522.dll > > DLL Name: Cairo.dll > > DLL Name: Glib.dll > > > > I see that the same problem from the mailing list thread is still > > present where the DLL references other DLLs that may have already been > > loaded. > > > > Just as extra information, the debug output of Dynaloader is as > > follows: > > > > $ export PERL_DL_DEBUG=1; ./test.exe > > DynaLoader.pm loaded (CODE(0x6c2728) ., > > C:\msys64\mingw64\lib\perl5\core_perl C:\msys64\tmp\par-7a616b69\cache- > > b75d584224b1a1061779c0bb91d380c83ae4a68e) > > dl_findfile() > > dl_findfile found: > > DynaLoader::bootstrap for IO (auto/IO/IO.dll) > > DynaLoader::bootstrap for Fcntl (auto/Fcntl/Fcntl.dll) > > DynaLoader::bootstrap for Cwd (auto/Cwd/Cwd.dll) > > DynaLoader::bootstrap for Compress::Raw::Zlib > > (auto/Compress/Raw/Zlib/Zlib.dll) > > DynaLoader::bootstrap for List::Util (auto/List/Util/Util.dll) > > DynaLoader::bootstrap for Encode (auto/Encode/Encode.dll) > > DynaLoader::bootstrap for Data::Dumper > > (auto/Data/Dumper/Dumper.dll) > > DynaLoader::bootstrap for Win32 (auto/Win32/Win32.dll) > > DynaLoader::bootstrap for File::Glob (auto/File/Glob/Glob.dll) > > DynaLoader::bootstrap for PerlIO::scalar > > (auto/PerlIO/scalar/scalar.dll) > > DynaLoader::bootstrap for Tie::Hash::NamedCapture > > (auto/Tie/Hash/NamedCapture/NamedCapture.dll) > > DynaLoader::bootstrap for attributes > > (auto/attributes/attributes.dll) > > DynaLoader::bootstrap for Cairo (auto/Cairo/Cairo.dll) > > DynaLoader::bootstrap for Glib (auto/Glib/Glib.dll) > > DynaLoader::bootstrap for Cairo::GObject > > (auto/Cairo/GObject/GObject.dll) > > Can't load 'C:\msys64\tmp\par-7a616b69\cache- > > b75d584224b1a1061779c0bb91d380c83ae4a68e\79d2d23b.dll' for module > > Cairo::GObject: load_file:The specified module could not be found at > > C:/msys64/mingw64/lib/perl5/core_perl/DynaLoader.pm line 193. > > # ---snip --- > > > > If the problem is that a DLL is being loaded twice (with a different > > name), then why not keep a package variable to cache this and skip the > > step if it has already been loaded? > > > > Regards, > > - Zaki Mughal > > > > > > > > Cheers, Roderich