On 10/13/2012 12:46 PM, Martin Storsjö wrote:
> From: "Ronald S. Bultje" <rsbul...@gmail.com>
> 
> This requires the makedef perl script by Derek, which probably will
> go into the c99-to-c89 repo. That scripts produces a .def file,
> listing the symbols to be exported, based on the gcc version
> scripts and the built object files.
> 
> To properly load non-function symbols from DLL files, the data
> symbol declarations need to have the attribute __declspec(dllimport)
> when building the calling code. (On mingw, the linker can fix this
> up automatically, which is why it has not been an issue so far.)
> 
> The __declspec(dllimport) attribute is added via a macro. Since
> it has to be present when building code that refer to these symbols,
> but not be present while building the library that exports the symbols
> themselves, the makefile is modified to add a define like
> COMPILING_<libname> while building each library. This is used in the
> definition of the AV<lib>_SYMBOL macro - on non-MSVC compilers, it is
> empty. On MSVC, it is __declspec(dllimport) for declarations in other
> libraries than the object file currently compiled.
> 
> This also implies that code that is built to link to a certain
> library as a DLL can't link to the same library as a static library.
> Therefore, we only allow building either static or shared but not
> both at the same time.
> 
> Also, linking to DLLs is slightly different from linking to shared
> libraries on other platforms. DLLs use a thing called import
> libraries, which is basically a stub library allowing the linker
> know which symbols exist in the DLL and what name the DLL will
> have at runtime.
> 
> In mingw/gcc, the import library is usually named libfoo.dll.a,
> which goes next to a static library named libfoo.a. This allows gcc
> to pick the dynamic one, if available, from the normal -lfoo switches,
> just as it does for libfoo.a vs libfoo.so on unix. On MSVC however,
> you need to literally specify the name of the import library instead of
> the static library.
> ---
>  configure                  |   27 ++++++++++++++++++++++++---
>  libavcodec/ac3tab.h        |    3 ++-
>  libavcodec/dca.h           |    3 ++-
>  libavcodec/mjpeg.h         |   15 ++++++++-------
>  libavcodec/mpeg12data.h    |    3 ++-
>  libavcodec/mpeg4audio.h    |    3 ++-
>  libavcodec/mpegaudiodata.h |    6 ++++--
>  libavcodec/symbols.h       |   32 ++++++++++++++++++++++++++++++++
>  library.mak                |    1 +
>  9 files changed, 77 insertions(+), 16 deletions(-)
>  create mode 100644 libavcodec/symbols.h
> 
> diff --git a/configure b/configure
> index 99830d8..5480ce0 100755
> --- a/configure
> +++ b/configure
> @@ -2778,14 +2778,33 @@ case $target_os in
>          shlibdir_default="$bindir_default"
>          SLIBPREF=""
>          SLIBSUF=".dll"
> +        if enabled_all msvc shared; then
> +            # Link to the import library instead of the
> +            # normal static library.
> +            LD_LIB='%.lib'
> +        fi
>          
> SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
>          SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
> -        SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) 
> -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
> +        if enabled msvc; then
> +            # The libtarget names for lib.exe differ from the ones for 
> dlltool
> +            if enabled x86_64; then
> +                LIBTARGET=x64
> +            fi
> +            SLIB_CREATE_DEF_CMD='makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > 
> $$(@:$(SLIBSUF)=.def)'
> +            SLIB_EXTRA_CMD='-lib.exe -machine:$(LIBTARGET) 
> -def:$$(@:$(SLIBSUF)=.def) -out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
> +        else
> +            SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d 
> $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D 
> $(SLIBNAME_WITH_MAJOR)'
> +        fi
>          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'
> +        if enabled msvc; then
> +            SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
> +            SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) 
> -implib:$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a)'
> +        else
> +            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'
> +        fi
>          objformat="win32"
>          dlltool="${cross_prefix}dlltool"
>          ranlib=:

Could be useful using a different section, seems to me that the two
share just a little now.

lu

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to