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