Opened 4 weeks ago

Last modified 6 days ago

#7229 open defect

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 (7)

comment:1 Changed 3 weeks ago by CoRoNe

Linking against Freetype 2.9 works just fine:

LD      libavfilter/avfilter-7.dll
/cygdrive/[...]/i686-w64-mingw32-dlltool -m i386 -d libavfilter/avfilter-7.def -l libavfilter/avfilter.lib -D avfilter-7.dll

To be clear, I've also reported this to the developers of Freetype, but they suggest I come here first.

comment:2 Changed 11 days ago by CoRoNe

Does anyone have any idea?

comment:3 Changed 11 days ago by jamrial

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 Changed 10 days ago by cehoyos

  • Keywords multiple definition of freetype removed

comment:5 Changed 8 days ago by CoRoNe

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 Changed 8 days ago by jamrial

  • Reproduced by developer set
  • Status changed from new to 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 Changed 6 days ago by CoRoNe

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.

Note: See TracTickets for help on using tickets.