[FFmpeg-devel] [PATCH] Shared library support for MSVC build.

jamal jamrial at gmail.com
Wed Oct 3 23:01:03 CEST 2012


On 03/10/12 2:35 AM, Ronald S. Bultje wrote:> Hi,
> 
> On Tue, Oct 2, 2012 at 8:59 PM, jamal <jamrial at gmail.com> wrote:
>> You're doing what you mentioned you wanted to avoid the other day: Create a header for essentially a single purpose/platform and include it in those files that would require it.
>> __declspec() is an attribute, so you could instead add it to libavutil/attributes.h to more or less avoid that, since it's a widely used header.
> 
> Can do, but then I'd need to create a libavcodec/attributes.h also,
> which I thought was kind of weird, i.e. you'd have
> libavutil/attributes.h with all general attributes, and then
> libavcodec/attributes.h with the symbol-stuff specific to libavcodec.
> But sure if you prefer, I can do that too...
> 
> Ronald

Can't you use libavutil/attributes.h for both cases instead of creating a new header in libavcodec?

That aside:

> @@ -3078,11 +3079,13 @@ case $target_os in
>          shlibdir_default="$bindir_default"
>          SLIBPREF=""
>          SLIBSUF=".dll"
> +        LIBPREF=""
> +        LIBSUF=".lib"
>          SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
>          SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
>          dlltool="${cross_prefix}dlltool"
>          if check_cmd lib.exe -list; then
> -            SLIB_EXTRA_CMD='-lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
> +            SLIB_EXTRA_CMD='-lib.exe -machine:$(LIBTARGET) -def:$$(@:$(SLIBSUF)=.def) -out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
>              if enabled x86_64; then
>                  LIBTARGET=x64
>              fi
> @@ -3092,8 +3095,8 @@ case $target_os in
>          SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
>          SLIB_INSTALL_LINKS=
>          SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
> -        SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
> -        SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
> +        SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
> +        SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a)'
>          objformat="win32"
>          ranlib=:
>          enable dos_paths

This breaks compilation with Mingw. The change to SHFLAGS generates this error:

LD      libavutil/avutil-51.dll
i686-w64-mingw32-gcc.exe: error: unrecognized command line option '-implib:libavutil/libavutil.dll.a'
make: *** [libavutil/avutil-51.dll] Error 1

And the change to SLIB_INSTALL_EXTRA_LIB generates this error during install (After undoing the change to SHFLAGS so the libraries actually compile):

$ make install
INSTALL libavdevice/avdevice.lib
INSTALL libavdevice/avdevice.dll
STRIP   install-libavdevice-shared
INSTALL libavdevice/avdevice.dll
INSTALL libavdevice/avdevice.dll
install: cannot stat `libavdevice/libavdevice.dll': No such file or directory
make: *** [install-libavdevice-shared] Error 1

Also, by changing LIBSUF to ".lib" you're making the build system overwrite the static libraries created with gnu ar with the shared ones created with lib.exe/dlltool (Or skipping the creation of static libraries altogether if lib.exe/dlltool was run first, since a .lib file would already exist)

Regards.


More information about the ffmpeg-devel mailing list