mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 19:08:59 +00:00
238996667c
The latest automated mingw-w64 build's libstdc++-6.dll crashes with qpdf 4.1.0, but libstdc++-6.dll can be replaced with one from a newer build.
246 lines
10 KiB
Plaintext
246 lines
10 KiB
Plaintext
Common Setup
|
|
============
|
|
|
|
You may need to disable antivirus software to run qpdf's test suite.
|
|
|
|
To be able to build qpdf and run its test suite, you must have MSYS
|
|
from MinGW installed, and you must have ActiveState Perl. Here's what
|
|
I did on my system:
|
|
|
|
Install ActiveState perl.
|
|
|
|
Grab the latest mingw-get-inst. From the installation wizard, choose
|
|
to install developer kit, C, and C++ support. Once installed, you
|
|
will have an icon to start an msys shell. From the msys shell, run
|
|
|
|
mingw-get install msys-unzip msys-zip mingw32-make
|
|
|
|
Then replace perl and make with the appropriate versions:
|
|
|
|
mv /bin/perl.exe /bin/msys-perl.exe
|
|
mv /bin/make.exe /bin/msys-make.exe
|
|
mv /mingw/bin/mingw32-make.exe /mingw/bin/make.exe
|
|
|
|
Make sure perl --version shows ActiveState perl.
|
|
|
|
To install MinGW-w64, first install msys and mingw32 as above.
|
|
|
|
From MinGW-w64 download page, go to "Toolchains targeting
|
|
Win64/Automated Builds" and find the latest mingw-w64 that runs under
|
|
i686-mingw. It will be called something like
|
|
mingw-w64-bin_i686-mingw_yyyymmdd.zip. The compiler binaries are
|
|
32-bit, which (of course) runs on 64-bit Windows. Extract this under
|
|
C:\MinGW-w64, and add C:\MinGW-w64\bin and C:\MinGW-w64\lib\mingw to
|
|
the path.
|
|
|
|
Starting in version 4.1.0, qpdf uses std::setprecision and std::fixed
|
|
to format floating point numbers, and using one or both of those
|
|
causes a crash with the version of libstdc++-6 that is included with
|
|
mingw-w64-bin_i686-mingw_20111220.zip, which appears to be the latest
|
|
mingw-hosted version of mingw that targets w64 that includes the full
|
|
toolchain including all the DLL creation tools. To work around this,
|
|
for my personal build, I have grabbed
|
|
x86_64-w64-mingw32-gcc-4.7.2-release-win64_rubenvb.7z from the
|
|
personal builds and just extracted libstdc++-6.dll from there and used
|
|
that to replace the one in the 20111220 version, which is based on
|
|
4.7.0. That particular workaround results in a Windows-hosted 64-bit
|
|
targetted mingw that can build a qpdf that passes its test suite.
|
|
|
|
As of this writing, the image comparison tests confuse ghostscript in
|
|
cygwin, but there's a chance they might work at some point. If you
|
|
want to run them, you need ghostscript and tiff utils as well, and you
|
|
will need to add --enable-test-compare-images from the configure
|
|
statements given below.
|
|
|
|
Jian Ma <stronghorse@tom.com> has generously provided a port of QPDF
|
|
that works with Microsoft VC6. Several changes are required, but they
|
|
are well documented in his port. You can find the VC6 port in the
|
|
contrib area of the qpdf download area. It may not always be
|
|
up-to-date with the latest official qpdf release.
|
|
|
|
|
|
External Libraries
|
|
==================
|
|
|
|
In order to build qpdf, you must have copies of zlib and pcre. The
|
|
easy way to get them is to download them from the qpdf download area.
|
|
There are packages called external-libs-bin.zip and
|
|
external-libs-src.zip. If you are building with MSVC 2010 or MINGW,
|
|
you can just extract the qpdf-external-libs-bin.zip zip file into the
|
|
top-level qpdf source tree. Note that you need the 2012-06-20 version
|
|
(at least) to build qpdf 3.0 or greater since this includes 64-bit
|
|
libraries. It will create a directory called external-libs which
|
|
contains header files and precompiled libraries. Passing
|
|
--enable-external-libs to ./configure (which is done automatically if
|
|
you follow the instructions below) is sufficient to find them.
|
|
|
|
You can also obtain pcre and zlib directly on your own and install
|
|
them. If you are using mingw, you can just set CPPFLAGS, LDFLAGS, and
|
|
LIBS when you run ./configure so that it can find the header files and
|
|
libraries. If you are building with msvc and you want to do this, it
|
|
probably won't work because ./configure doesn't know how to interpret
|
|
LDFLAGS and LIBS properly for MSVC (though qpdf's own build system
|
|
does). In this case, you can probably get away with cheating by
|
|
passing --enable-external-libs to ./configure and then just editing
|
|
CPPFLAGS, LDFLAGS, LIBS in the generated autoconf.mk file. Note that
|
|
you should use UNIX-like syntax (-I, -L, -l) even though this is not
|
|
what cl takes on the command line. qpdf's build rules will fix it.
|
|
|
|
You can also download qpdf-external-libs-src.zip and follow the
|
|
instructions in the README.txt there for how to build external libs.
|
|
|
|
|
|
Building from version control
|
|
=============================
|
|
|
|
If you check out qpdf from version control, you will not have the
|
|
files that are generated by autoconf. If you are not changing these
|
|
files, you can grab them from a source distribution or create them
|
|
from a system that has autoconf. To create them from scratch, run
|
|
./autogen.sh on a system that has autoconf installed. Once you have
|
|
them, you can run make CLEAN=1 autofiles.zip. This will create an
|
|
autofiles.zip that you can extract on top of a fresh checkout.
|
|
|
|
|
|
Building with MinGW
|
|
===================
|
|
|
|
QPDF is known to build and pass its test suite with mingw (latest
|
|
version tested: gcc 4.6.2), mingw64 (latest version tested: 4.7.0) and
|
|
Microsoft Visual C++ 2010, both 32-bit and 64-bit versions. MSYS plus
|
|
ActiveState Perl is required to build as well in order to get make
|
|
and other related tools. While it is possible that Cygwin could be
|
|
used to build native Windows versions of qpdf, this configuration has
|
|
not been tested recently.
|
|
|
|
From your MSYS prompt, run
|
|
|
|
./config-mingw32
|
|
|
|
or
|
|
|
|
./config-mingw64
|
|
|
|
and then
|
|
|
|
make
|
|
|
|
Note that ./config-mingw32 and ./configure-mingw64 just run
|
|
./configure with specific arguments, so you can look at it, make
|
|
adjustments, and manually run configure instead. Note also that
|
|
config-mingw32 appends definition of _FILE_OFFSET_BITS=64 to
|
|
qpdf-config.h since, as of the qpdf 3.0 release, the current versions
|
|
of the autoconf tools did not correctly detect that mingw requires
|
|
this to get large file support. This workaround is only required for
|
|
mingw32. The 64-bit version of mingw works "out of the box" with
|
|
large file support, as do both the 32-bit and 64-bit versions of MSVC.
|
|
|
|
Add the absolute path to the libqpdf/build directory to your PATH.
|
|
Make sure you can run the qpdf command by typing qpdf/build/qpdf and
|
|
making sure you get a help message rather than an error loading the
|
|
DLL or no output at all. Run the test suite by typing
|
|
|
|
make check
|
|
|
|
If all goes well, you should get a passing test suite.
|
|
|
|
To create an installation directory, run make install. This will
|
|
create install-mingw/qpdf-VERSION and populate it. The binary
|
|
download of qpdf for Windows with mingw is created from this
|
|
directory.
|
|
|
|
You can also take a look at make_windows_releases for reference. This
|
|
is how the distributed Windows executables are created.
|
|
|
|
|
|
Building with MSVC 2010
|
|
=======================
|
|
|
|
These instructions would likely work with newer version of MSVC or
|
|
with full version of MSVC. They may also work with .NET 2005. They
|
|
have only been tested with Visual C++ 2010. Earlier version of qpdf
|
|
were built with MSVC 2008 Express.
|
|
|
|
You should first set up your environment to be able to run MSVC from
|
|
the command line. There is usually a batch file included with MSVC
|
|
that does this. Make sure that you start a command line environment
|
|
configured for whichever of 32-bit or 64-bit output that you intend to
|
|
build for.
|
|
|
|
From that cmd prompt, you can start your msys shell by just running
|
|
manually whatever command is associated with your msys shell icon.
|
|
|
|
Configure as follows:
|
|
|
|
./config-msvc 32
|
|
|
|
or
|
|
|
|
./config-msvc 64
|
|
|
|
Note that you must pass the 32/64 option that matches your command
|
|
line setup. The scripts do not presently figure this out. If you
|
|
used the wrong argument, it would probably just build the size you
|
|
have in your environment and then install the results in the wrong
|
|
place.
|
|
|
|
Once configured, run
|
|
|
|
make
|
|
|
|
Note that ./config-msvc just runs ./configure with specific arguments,
|
|
so you can look at it, make adjustments, and manually run configure
|
|
instead.
|
|
|
|
NOTE: automated dependencies are not generated with the msvc build.
|
|
If you're planning on making modifications, you should probably work
|
|
with mingw. If there is a need, I can add dependency information to
|
|
the msvc build, but since I only use it for generating release
|
|
versions, I haven't bothered.
|
|
|
|
Once built, add the full path to the libqpdf/build directory to your
|
|
path and run
|
|
|
|
make check
|
|
|
|
to run the test suite.
|
|
|
|
If you are building with MSVC and want to debug a crash in MSVC's
|
|
debugger, first start an instance of Visual C++. Then run qpdf. When
|
|
the abort/retry/ignore dialog pops up, first attach the process from
|
|
within visual C++, and then click Retry in qpdf.
|
|
|
|
A release version of qpdf is built by default. If you want to link
|
|
against debugging libraries, you will have to change /MD to /MDd in
|
|
make/msvc.mk. Note that you must redistribute the Microsoft runtime
|
|
DLLs. Linking with static runtime (/MT) won't work; see "Static
|
|
Runtime" below for details.
|
|
|
|
|
|
Runtime DLLs
|
|
============
|
|
|
|
Both build methods create executables and DLLs that are dependent on
|
|
the compiler's runtime DLLs. When you run make install, the
|
|
installation process will automatically detect the DLLs and copy them
|
|
into the installation bin directory. Look at the copy_dlls script for
|
|
details on how this is accomplished.
|
|
|
|
Redistribution of the runtime DLL is unavoidable as of this writing;
|
|
see "Static Runtime" below for details.
|
|
|
|
|
|
Static Runtime
|
|
==============
|
|
|
|
Building the DLL and executables with static runtime does not work
|
|
with either Visual C++ .NET 2008 (a.k.a. vc9) using /MT or with mingw
|
|
(at least as of 4.4.0) using -static-libgcc. The reason is that, in
|
|
both cases, there is static data involved with exception handling, and
|
|
when the runtime is linked in statically, exceptions cannot be thrown
|
|
across the DLL to EXE boundary. Since qpdf uses exception handling
|
|
extensively for error handling, we have no choice but to redistribute
|
|
the C++ runtime DLLs. Maybe this will be addressed in a future
|
|
version of the compilers. This has not been retested with the
|
|
toolchain versions used to create qpdf 3.0 distributions.
|