[FFmpeg-devel] FATE failure on mingw gcc-4.2.4
Ramiro Polla
ramiro.polla
Thu Mar 11 12:46:14 CET 2010
2010/3/9 M?ns Rullg?rd <mans at mansr.com>:
> Ramiro Polla <ramiro.polla at gmail.com> writes:
>> 2010/3/9 M?ns Rullg?rd <mans at mansr.com>:
>>> The build failures on mingw with gcc 4.2.4 are caused by the recent
>>> addition of -Werror=missing-prototypes triggering an error in
>>> stdio.h. ?For some reason, this gcc version isn't treating this as a
>>> system header and suppressing warnings.
>>>
>>> It might be possible to work around this by providing an explicit
>>> --sysroot argument to ffmpeg's configure. ?Could someone with an
>>> affected system please try this?
>>
>> --sysroot made no difference. I had to rebuild binutils for FFmpeg's
>> configure to accept sysroot, should I rebuild gcc with some other
>> option too?
>
> IIRC, gcc configure takes a --with-sysroot flag or similar.
>
>> from _mingw.h:
>> # if __GNUC_STDC_INLINE__
>> # ?define __CRT_INLINE extern inline __attribute__((__gnu_inline__))
>> # else
>> # ?define __CRT_INLINE extern __inline__
>> # endif
>>
>> from stdio.h:
>> #if !defined _MT
>>
>> __CRT_INLINE int __cdecl __MINGW_NOTHROW getc (FILE* __F)
>>
>> [...]
>>
>> #else ?/* Use library functions. ?*/
>>
>> _CRTIMP int __cdecl __MINGW_NOTHROW ? ? getc (FILE*);
>> _CRTIMP int __cdecl __MINGW_NOTHROW ? ? putc (int, FILE*);
>> _CRTIMP int __cdecl __MINGW_NOTHROW ? ? getchar (void);
>> _CRTIMP int __cdecl __MINGW_NOTHROW ? ? putchar (int);
>>
>> #endif
>>
>> in 4.2.2 that becomes (text vertically aligned):
>> extern __inline__ ? ? ? ? ? ? ? ? ? ? ? ? ? ? int
>> __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) getc (FILE* __F)
>
> Right, now I remember the C99-compatible inline semantics are only
> available in gcc 4.3 and later. ?The earlier ones do something else,
> and do not define that macro.
>
> What this means is that the mingw headers do not work _at all_ with
> gcc 4.2. ?Try compiling two object files, both calling getc(), and
> link them together. ?Unless I am mistaken, you'll get a multiple
Looks like it worked by pure luck:
$ cat getctest1.c
#include <stdio.h>
void foo1(void) { getc(NULL); }
$ cat getctest2.c
#include <stdio.h>
void foo2(void) { getc(NULL); }
$ i686-mingw32-gcc-4.2 -o getctest1.o -c getctest1.c
$ i686-mingw32-gcc-4.2 -o getctest2.o -c getctest2.c
$ i686-mingw32-gcc-4.2 -shared -o getctest.dll getctest1.o getctest2.o
$ i686-mingw32-objdump -d getctest.dll
[...]
10001180 <_foo1>:
10001180: 55 push %ebp
10001181: 89 e5 mov %esp,%ebp
10001183: 83 ec 08 sub $0x8,%esp
10001186: c7 04 24 00 00 00 00 movl $0x0,(%esp)
1000118d: e8 e6 03 00 00 call 10001578 <_getc>
10001192: c9 leave
10001193: c3 ret
10001194 <_foo2>:
10001194: 55 push %ebp
10001195: 89 e5 mov %esp,%ebp
10001197: 83 ec 08 sub $0x8,%esp
1000119a: c7 04 24 00 00 00 00 movl $0x0,(%esp)
100011a1: e8 d2 03 00 00 call 10001578 <_getc>
100011a6: c9 leave
100011a7: c3 ret
[...]
> definition error. ?You should report this as a bug to the mingw devs.
https://sourceforge.net/tracker/?func=detail&aid=2968618&group_id=2435&atid=102435
Should we document that users should
-#if !defined _MT
+#if 0
when using mingw gcc 4.2?
More information about the ffmpeg-devel
mailing list