Discussion:
[theora] Building theora 1.1.1 with mingw-w64-gcc 7.1 and msys
Edgar Reynaldo
2017-06-01 19:53:29 UTC
Permalink
Hello,

I recently attempted to build theora 1.1.1 with mingw-w64-gcc 7.1 and
msys and it fails to build the encoder_example.c example program. There
are multiple declarations of the function 'rint'. The source file
created its own version of the function that rounds AWAY from zero.
MinGW-W64 has its own version of the 'rint' function, which does not
round away from zero. Therefore, encoder_example.c's rint function is
necessary, but needs to be renamed because it includes math.h, which
defines "extern __cdecl double rint(double)".

Here is the relevant function from encoder_example.c lines 50-62 :

#ifdef _WIN32
/*supply missing headers and functions to Win32. going to hell, I know*/
#include <fcntl.h>
#include <io.h>

static double rint(double x)
{
if (x < 0.0)
return (double)(int)(x - 0.5);
else
return (double)(int)(x + 0.5);
}
#endif

Is this fixed in more recent versions? Should I use 1.2 alpha? Should I
build from the latest repository source? Ideas?

I'm willing to submit a patch, but I don't know what the resulting
function should be renamed.

Edgar
Edgar Reynaldo
2017-06-01 22:40:45 UTC
Permalink
Hi people,

I fixed the problem by renaming the function and every instance of
'rint' to 'rint_az' (Round Int Away from Zero) and then
encoder_example.c built successfully.

Don't know if this needs to be patched upstream or not.

Edgar
Post by Edgar Reynaldo
Hello,
I recently attempted to build theora 1.1.1 with mingw-w64-gcc 7.1 and
msys and it fails to build the encoder_example.c example program.
There are multiple declarations of the function 'rint'. The source
file created its own version of the function that rounds AWAY from
zero. MinGW-W64 has its own version of the 'rint' function, which does
not round away from zero. Therefore, encoder_example.c's rint function
is necessary, but needs to be renamed because it includes math.h,
which defines "extern __cdecl double rint(double)".
#ifdef _WIN32
/*supply missing headers and functions to Win32. going to hell, I know*/
#include <fcntl.h>
#include <io.h>
static double rint(double x)
{
if (x < 0.0)
return (double)(int)(x - 0.5);
else
return (double)(int)(x + 0.5);
}
#endif
Is this fixed in more recent versions? Should I use 1.2 alpha? Should
I build from the latest repository source? Ideas?
I'm willing to submit a patch, but I don't know what the resulting
function should be renamed.
Edgar
Ralph Giles
2017-06-01 22:50:00 UTC
Permalink
Post by Edgar Reynaldo
I fixed the problem by renaming the function and every instance of
'rint' to 'rint_az' (Round Int Away from Zero) and then
encoder_example.c built successfully.
Don't know if this needs to be patched upstream or not.
Upstream has the same code, so I expect the fix is needed there too.

Renaming it means always using the replacement, while a libc which
provides it might have a better implementation. Is there a preprocessor
define we could use to distinguish it? e.g.

#if defined(_WIN32) && !defined(__MINGW__)

or something similar. Or you could add a configure check for HAVE_RINT.
Note that quite a few of the examples use it.

Alternatively, it looks like Visual Studio provides rint these days, so
just removing the replacement code might be a viable option.

-r

Loading...