Opened 7 years ago
Closed 6 years ago
#7229 closed defect (invalid)
Compilation error with --enable-libfreetype
Reported by: | CoRoNe | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avfilter |
Version: | git-master | Keywords: | libfreetype |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | yes | |
Analyzed by developer: | no |
Description
I'm cross-compiling on Windows (using Cygwin, MinGW and GCC). I've compiled and installed Freetype 2.9.1, but when I then compile a shared ffmpeg build (fe84f70 in this case) I'm suddenly getting the following error:
LD libavfilter/avfilter-7.dll /cygdrive/[...]/i686-w64-mingw32/lib/libfreetype.a(ftbase.o):ftbase.c:(.text+0x22a0): multiple definition of `FT_Done_Face' libavformat/libavformat.dll.a(d000017.o):(.text+0x0): first defined here /cygdrive/[...]/i686-w64-mingw32/lib/libfreetype.a(ftbase.o):ftbase.c:(.text+0x2ab0): multiple definition of `FT_Set_Char_Size' libavformat/libavformat.dll.a(d000104.o):(.text+0x0): first defined here /cygdrive/[...]/i686-w64-mingw32/lib/libfreetype.a(ftbase.o):ftbase.c:(.text+0x2b50): multiple definition of `FT_Set_Pixel_Sizes' libavformat/libavformat.dll.a(d000108.o):(.text+0x0): first defined here /cygdrive/[...]/i686-w64-mingw32/lib/libfreetype.a(ftbase.o):ftbase.c:(.text+0x2bd0): multiple definition of `FT_Get_Kerning' libavformat/libavformat.dll.a(d000037.o):(.text+0x0): first defined here /cygdrive/[...]/i686-w64-mingw32/lib/libfreetype.a(ftbase.o):ftbase.c:(.text+0x5570): multiple definition of `FT_Load_Char' libavformat/libavformat.dll.a(d000066.o):(.text+0x0): first defined here /cygdrive/[...]/i686-w64-mingw32/lib/libfreetype.a(ftbase.o):ftbase.c:(.text+0xac20): multiple definition of `FT_New_Face' libavformat/libavformat.dll.a(d000073.o):(.text+0x0): first defined here collect2: error: ld returned 1 exit status make: *** [ffbuild/library.mak:103: libavfilter/avfilter-7.dll] Error 1
Is this a regression in FFmpeg?
Change History (10)
comment:1 by , 7 years ago
comment:3 by , 6 years ago
Can you provide more details? What's the configure line you used? And are you sure your environment is sane? I can't seem to reproduce this using MinGW on an msys2 environment.
comment:4 by , 6 years ago
Keywords: | multiple definition of freetype removed |
---|
comment:5 by , 6 years ago
As I wasn't sure my environment was sane anymore, I nuked my sandbox and started over fresh. I've updated MinGW-w64 to v5.0.4 and GCC v8.1.0, but in the end it didn't matter one bit, because with the following configure line I got the same error as in my first post:
./configure --arch=x86 --target-os=mingw32 --cross-prefix=/cygdrive/m/ffmpeg-wind ows-build-helpers-master/ffmpeg_local_builds/sandbox/cross_compilers/mingw-w64-i6 86/bin/i686-w64-mingw32- --pkg-config=pkg-config --pkg-config-flags=--static --ex tra-version=Reino --enable-gray --enable-version3 --disable-debug --disable-doc - -disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --dis able-w32threads --enable-avisynth --enable-frei0r --enable-filter=frei0r --enable -gmp --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-lib bs2b --enable-libcaca --extra-cflags=-DCACA_STATIC --enable-libfdk-aac --enable-l ibflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable- libgme --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libmysofa -- enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable -libopenmpt --enable-libopus --enable-librubberband --enable-libsnappy --enable-l ibsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --extra-cflags=-D LIBTWOLAME_STATIC --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxa vs --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-m bedtls --extra-cflags='-march=pentium3' --extra-cflags='-mtune=athlon-xp' --extra -cflags=-O2 --extra-cflags='-mfpmath=sse' --extra-cflags=-msse --enable-shared -- disable-static --prefix=/cygdrive/m/ffmpeg-windows-build-helpers-master/ffmpeg_lo cal_builds/sandbox/win32/ffmpeg_git_shared
comment:6 by , 6 years ago
Reproduced by developer: | set |
---|---|
Status: | new → open |
Confirmed with "./configure --enable-libfreetype --enable-libbluray --pkg-config-flags=--static --enable-shared --disable-static && make libavfilter/avfilter-7.dll" only when using static libraries from both libbluray and libfreetype (.a and not .dll.a).
Using shared libfreetype 2.9.1 links fine.
This is unlikely to be an ffmpeg issue. Sounds more like either libfreetype of the binutils' linker at fault.
comment:7 by , 6 years ago
I've solved the issue.
While browsing Freetype's commits I came across d2d1750. I've had compilation failures with "declspec" before.
diff -ur builds/unix/ftconfig.in.bak builds/unix/ftconfig.in --- builds/unix/ftconfig.in.bak 2018-04-22 11:41:36.000000000 +0200 +++ builds/unix/ftconfig.in 2018-06-13 21:58:02.093750000 +0200 @@ -490,7 +490,7 @@ #ifdef FT2_BUILD_LIBRARY #if defined( _WIN32 ) && ( defined( _DLL ) || defined( DLL_EXPORT ) ) -#define FT_EXPORT( x ) __declspec( dllexport ) x +#define FT_EXPORT( x ) x #elif defined( __GNUC__ ) && __GNUC__ >= 4 #define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x #elif defined( __cplusplus ) @@ -502,7 +502,7 @@ #else #if defined( FT2_DLLIMPORT ) -#define FT_EXPORT( x ) __declspec( dllimport ) x +#define FT_EXPORT( x ) x #elif defined( __cplusplus ) #define FT_EXPORT( x ) extern "C" x #else diff -ur include/freetype/config/ftconfig.h.bak include/freetype/config/ftconfig.h --- include/freetype/config/ftconfig.h.bak 2018-04-22 11:41:36.000000000 +0200 +++ include/freetype/config/ftconfig.h 2018-06-13 21:58:46.234375000 +0200 @@ -458,7 +458,7 @@ #ifdef FT2_BUILD_LIBRARY #if defined( _WIN32 ) && ( defined( _DLL ) || defined( DLL_EXPORT ) ) -#define FT_EXPORT( x ) __declspec( dllexport ) x +#define FT_EXPORT( x ) x #elif defined( __GNUC__ ) && __GNUC__ >= 4 #define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x #elif defined( __cplusplus ) @@ -470,7 +470,7 @@ #else #if defined( FT2_DLLIMPORT ) -#define FT_EXPORT( x ) __declspec( dllimport ) x +#define FT_EXPORT( x ) x #elif defined( __cplusplus ) #define FT_EXPORT( x ) extern "C" x #else
I've removed all mentions of __declspec
, recompiled freetype, but also those that depend on it (fontconfig, libbluray and libass) and of course ffmpeg in the end. This proved successful and got me a working shared build.
comment:8 by , 6 years ago
The fix I presented above is more of a workaround. According to Alexei Podtelezhnikov (from the Freetype team) DLL_EXPORT and FT2_BUILD_LIBRARY shouldn't be defined if I build a static Freetype library and the 'fix' should therefor not be needed.
He has had a look at my logs and says "The errors suggest that both libfreetype.a and libavformat.dll.a provide FreeType. That would be a problem to link togeher."
You say you reproduced this issue, James. Do you, or anyone else, have any idea what could be the cause and perhaps more important; is this a Freetype or a FFmpeg issue?
comment:9 by , 6 years ago
I guess it was a Freetype issue after all. The "Fortify dllexport/dllimport attributes "-commit fixed it for me. If it does the same for you, James, then you can close this ticket as far as I'm concerned.
comment:10 by , 6 years ago
Resolution: | → invalid |
---|---|
Status: | open → closed |
Thank you for testing again!
Linking against Freetype 2.9 works just fine:
To be clear, I've also reported this to the developers of Freetype, but they suggest I come here first.