104
90
@item Building natively using MSYS can be sped up by disabling implicit rules
105
91
in the Makefile by calling @code{make -r} instead of plain @code{make}. This
106
92
speed up is close to non-existent for normal one-off builds and is only
107
noticeable when running make for a second time (for example in
93
noticeable when running make for a second time (for example during
108
94
@code{make install}).
110
96
@item In order to compile AVplay, you must have the MinGW development library
111
of @uref{http://www.libsdl.org/, SDL}.
112
Edit the @file{bin/sdl-config} script so that it points to the correct prefix
113
where SDL was installed. Verify that @file{sdl-config} can be launched from
114
the MSYS command line.
97
of @uref{http://www.libsdl.org/, SDL} and @code{pkg-config} installed.
116
99
@item By using @code{./configure --enable-shared} when configuring Libav,
117
you can build libavutil, libavcodec and libavformat as DLLs.
121
@section Microsoft Visual C++ compatibility
123
As stated in the FAQ, Libav will not compile under MSVC++. However, if you
124
want to use the libav* libraries in your own applications, you can still
125
compile those applications using MSVC++. But the libav* libraries you link
126
to @emph{must} be built with MinGW. However, you will not be able to debug
127
inside the libav* libraries, since MSVC++ does not recognize the debug
128
symbols generated by GCC.
129
We strongly recommend you to move over from MSVC++ to MinGW tools.
131
This description of how to use the Libav libraries with MSVC++ is based on
132
Microsoft Visual C++ 2005 Express Edition. If you have a different version,
133
you might have to modify the procedures slightly.
135
@subsection Using static libraries
137
Assuming you have just built and installed Libav in @file{/usr/local}.
141
@item Create a new console application ("File / New / Project") and then
142
select "Win32 Console Application". On the appropriate page of the
143
Application Wizard, uncheck the "Precompiled headers" option.
145
@item Write the source code for your application, or, for testing, just
146
copy the code from an existing sample application into the source file
147
that MSVC++ has already created for you. For example, you can copy
148
@file{libavformat/output-example.c} from the Libav distribution.
150
@item Open the "Project / Properties" dialog box. In the "Configuration"
151
combo box, select "All Configurations" so that the changes you make will
152
affect both debug and release builds. In the tree view on the left hand
153
side, select "C/C++ / General", then edit the "Additional Include
154
Directories" setting to contain the path where the Libav includes were
155
installed (i.e. @file{c:\msys\1.0\local\include}).
156
Do not add MinGW's include directory here, or the include files will
157
conflict with MSVC's.
159
@item Still in the "Project / Properties" dialog box, select
160
"Linker / General" from the tree view and edit the
161
"Additional Library Directories" setting to contain the @file{lib}
162
directory where Libav was installed (i.e. @file{c:\msys\1.0\local\lib}),
163
the directory where MinGW libs are installed (i.e. @file{c:\mingw\lib}),
164
and the directory where MinGW's GCC libs are installed
165
(i.e. @file{C:\mingw\lib\gcc\mingw32\4.2.1-sjlj}). Then select
166
"Linker / Input" from the tree view, and add the files @file{libavformat.a},
167
@file{libavcodec.a}, @file{libavutil.a}, @file{libmingwex.a},
168
@file{libgcc.a}, and any other libraries you used (i.e. @file{libz.a})
169
to the end of "Additional Dependencies".
171
@item Now, select "C/C++ / Code Generation" from the tree view. Select
172
"Debug" in the "Configuration" combo box. Make sure that "Runtime
173
Library" is set to "Multi-threaded Debug DLL". Then, select "Release" in
174
the "Configuration" combo box and make sure that "Runtime Library" is
175
set to "Multi-threaded DLL".
177
@item Click "OK" to close the "Project / Properties" dialog box.
179
@item MSVC++ lacks some C99 header files that are fundamental for Libav.
180
Get msinttypes from @url{http://code.google.com/p/msinttypes/downloads/list}
181
and install it in MSVC++'s include directory
182
(i.e. @file{C:\Program Files\Microsoft Visual Studio 8\VC\include}).
184
@item MSVC++ also does not understand the @code{inline} keyword used by
185
Libav, so you must add this line before @code{#include}ing libav*:
187
#define inline _inline
190
@item Build your application, everything should work.
194
@subsection Using shared libraries
196
This is how to create DLL and LIB files that are compatible with MSVC++:
198
Within the MSYS shell, build Libav with
201
./configure --enable-shared
100
you can build all libraries as DLLs.
104
@section Microsoft Visual C++
106
Libav can be built with MSVC using a C99-to-C89 conversion utility and
109
You will need the following prerequisites:
112
@item @uref{https://github.com/libav/c99-to-c89/, C99-to-C89 Converter & Wrapper}
113
@item @uref{http://code.google.com/p/msinttypes/, msinttypes}
114
@item @uref{http://www.mingw.org/, MSYS}
115
@item @uref{http://yasm.tortall.net/, YASM}
116
@item @uref{http://gnuwin32.sourceforge.net/packages/bc.htm, bc for Windows} if
117
you want to run @uref{fate.html, FATE}.
120
To set up a proper MSVC environment in MSYS, you simply need to run
121
@code{msys.bat} from the Visual Studio command prompt.
123
Place @code{makedef}, @code{c99wrap.exe}, @code{c99conv.exe}, and @code{yasm.exe}
124
somewhere in your @code{PATH}.
126
Next, make sure @code{inttypes.h} and any other headers and libs you want to use
127
are located in a spot that MSVC can see. Do so by modifying the @code{LIB} and
128
@code{INCLUDE} environment variables to include the @strong{Windows} paths to
129
these directories. Alternatively, you can try and use the
130
@code{--extra-cflags}/@code{--extra-ldflags} configure options.
135
./configure --toolchain=msvc
206
Your install path (@file{/usr/local/} by default) should now have the
207
necessary DLL and LIB files under the @file{bin} directory.
209
Alternatively, build the libraries with a cross compiler, according to
210
the instructions below in @ref{Cross compilation for Windows with Linux}.
212
To use those files with MSVC++, do the same as you would do with
213
the static libraries, as described above. But in Step 4,
214
you should only need to add the directory where the LIB files are installed
215
(i.e. @file{c:\msys\usr\local\bin}). This is not a typo, the LIB files are
216
installed in the @file{bin} directory. And instead of adding the static
217
libraries (@file{libxxx.a} files) you should add the MSVC import libraries
218
(@file{avcodec.lib}, @file{avformat.lib}, and
219
@file{avutil.lib}). Note that you should not use the GCC import
220
libraries (@file{libxxx.dll.a} files), as these will give you undefined
221
reference errors. There should be no need for @file{libmingwex.a},
222
@file{libgcc.a}, and @file{wsock32.lib}, nor any other external library
223
statically linked into the DLLs.
140
If you wish to compile shared libraries, add @code{--enable-shared} to your
141
configure options. Note that due to the way MSVC handles DLL imports and
142
exports, you cannot compile static and shared libraries at the same time, and
143
enabling shared libraries will automatically disable the static ones.
149
@item It is possible that coreutils' @code{link.exe} conflicts with MSVC's linker.
150
You can find out by running @code{which link} to see which @code{link.exe} you
151
are using. If it is located at @code{/bin/link.exe}, then you have the wrong one
152
in your @code{PATH}. Either move or remove that copy, or make sure MSVC's
153
@code{link.exe} takes precedence in your @code{PATH} over coreutils'.
155
@item If you wish to build with zlib support, you will have to grab a compatible
156
zlib binary from somewhere, with an MSVC import lib, or if you wish to link
157
statically, you can follow the instructions below to build a compatible
158
@code{zlib.lib} with MSVC. Regardless of which method you use, you must still
159
follow step 3, or compilation will fail.
161
@item Grab the @uref{http://zlib.net/, zlib sources}.
162
@item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since
163
this is how Libav is built as well.
164
@item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets
165
erroneously included when building Libav.
166
@item Run @code{nmake -f win32/Makefile.msc}.
167
@item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC
171
@item Libav has been tested with Visual Studio 2010 and 2012, Pro and Express.
172
Anything else is not officially supported.
176
@subsection Linking to Libav with Microsoft Visual C++
178
If you plan to link with MSVC-built static libraries, you will need
179
to make sure you have @code{Runtime Library} set to
180
@code{Multi-threaded (/MT)} in your project's settings.
225
182
Libav headers do not declare global data for Windows DLLs through the usual
226
183
dllexport/dllimport interface. Such data will be exported properly while
227
building, but to use them in your MSVC++ code you will have to edit the
184
building, but to use them in your MSVC code you will have to edit the
228
185
appropriate headers and mark the data as dllimport. For example, in
229
186
libavutil/pixdesc.h you should have:
231
188
extern __declspec(dllimport) const AVPixFmtDescriptor av_pix_fmt_descriptors[];
234
Note that using import libraries created by dlltool requires
235
the linker optimization option to be set to
236
"References: Keep Unreferenced Data (@code{/OPT:NOREF})", otherwise
237
the resulting binaries will fail during runtime. This isn't
238
required when using import libraries generated by lib.exe.
191
You will also need to define @code{inline} to something MSVC understands:
193
#define inline __inline
196
Also note, that as stated in @strong{Microsoft Visual C++}, you will need
197
an MSVC-compatible @uref{http://code.google.com/p/msinttypes/, inttypes.h}.
199
If you plan on using import libraries created by dlltool, you must
200
set @code{References} to @code{No (/OPT:NOREF)} under the linker optimization
201
settings, otherwise the resulting binaries will fail during runtime.
202
This is not required when using import libraries generated by @code{lib.exe}.
239
203
This issue is reported upstream at
240
204
@url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}.
356
298
./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
303
The native @uref{http://plan9.bell-labs.com/plan9/, Plan 9} compiler
304
does not implement all the C99 features needed by Libav so the gcc
305
port must be used. Furthermore, a few items missing from the C
306
library and shell environment need to be fixed.
310
@item GNU awk, grep, make, and sed
312
Working packages of these tools can be found at
313
@uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9}.
314
They can be installed with @uref{http://9front.org/, 9front's} @code{pkg}
315
utility by setting @code{pkgpath} to
316
@code{http://ports2plan9.googlecode.com/files/}.
318
@item Missing/broken @code{head} and @code{printf} commands
320
Replacements adequate for building Libav can be found in the
321
@code{compat/plan9} directory. Place these somewhere they will be
322
found by the shell. These are not full implementations of the
323
commands and are @emph{not} suitable for general use.
325
@item Missing C99 @code{stdint.h} and @code{inttypes.h}
327
Replacement headers are available from
328
@url{http://code.google.com/p/plan9front/issues/detail?id=152}.
330
@item Missing or non-standard library functions
332
Some functions in the C library are missing or incomplete. The
333
@code{@uref{http://ports2plan9.googlecode.com/files/gcc-apelibs-1207.tbz,
334
gcc-apelibs-1207}} package from
335
@uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9}
336
includes an updated C library, but installing the full package gives
337
unusable executables. Instead, keep the files from @code{gccbin.tgz}
338
under @code{/386/lib/gnu}. From the @code{libc.a} archive in the
339
@code{gcc-apelibs-1207} package, extract the following object files and
340
turn them into a library:
343
@item @code{strerror.o}
344
@item @code{strtoll.o}
345
@item @code{snprintf.o}
346
@item @code{vsnprintf.o}
347
@item @code{vfprintf.o}
348
@item @code{_IO_getc.o}
349
@item @code{_IO_putc.o}
352
Use the @code{--extra-libs} option of @code{configure} to inform the
353
build system of this library.
355
@item FPU exceptions enabled by default
357
Unlike most other systems, Plan 9 enables FPU exceptions by default.
358
These must be disabled before calling any Libav functions. While the
359
included tools will do this automatically, other users of the
360
libraries must do it themselves.