<div dir="ltr">Solved!<div>I had the OLD version of SDL under /usr/include/SDL and the new SDL2 under /usr/include/SDL2  !!! I've sincve totally obliterated the old version!</div><div>I guess it's Sherlock Holmes again isn't it, "no matter how imporable, must be the truth"...and the compiler told the truth I was too dumb to see it!</div><div><br></div><div>I also think I need to appreciate more that functions ARE just predicates more!</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 25 Jun 2019 at 11:34, Julien Fischer <<a href="mailto:jfischer@opturion.com">jfischer@opturion.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Hi Sean,<br>
<br>
On Tue, 25 Jun 2019, emacstheviking wrote:<br>
<br>
> Hi,I have these two lines of code...<br>
> <br>
> :- pragma foreign_decl("C", "#include <SDL/SDL.h>").<br>
> :- pragma foreign_decl("C", "#include <SDL/SDL_version.h>").<br>
> <br>
> at the top of my module in the implementation section and this code too:<br>
> :- func sdl_up = int.<br>
> :- pragma foreign_proc("C",<br>
>                        sdl_up = (Result::out),<br>
>                        [ will_not_call_mercury<br>
>                        , not_thread_safe<br>
>                        , promise_pure<br>
>                        ],<br>
>                        "Result = SDL_Init(SDL_INIT_EVERYTHING);").<br>
> <br>
> <br>
> :- func sdl_revision = string.<br>
> :- pragma foreign_proc("C",<br>
>                        sdl_revision = (Version::out),<br>
>                        [ will_not_call_mercury<br>
>                        , not_thread_safe<br>
>                        , promise_pure<br>
>                        ],<br>
>                        "Version = (MR_String*)SDL_GetRevision();").<br>
> <br>
> The call to SDL_Init() seems to work but the compiler produces an error message saying that it cannot finf SDL_GetRevision()<br>
> <br>
> ffi.m: In function ‘ffi__sdl_revision_0_f_0’:<br>
> ffi.m:37:23: warning: implicit declaration of function ‘SDL_GetRevision’; did you mean ‘SDL_GetCursor’?<br>
> [-Wimplicit-function-declaration]<br>
>                         "Version = (MR_String*)SDL_GetRevision();").<br>
>                        ^~~~~~~~~~~~~~~<br>
>                        SDL_GetCursor<br>
<br>
The error is coming from the C compiler when it attempts to compile the<br>
generated C code.  (The Mercury compiler emits #file and #line directives<br>
so that C compiler errors are mapped backed to their location in the<br>
original Mercury source file.)<br>
<br>
> When I look at the Mercury/cs/ffi.c file i can not see any of my<br>
> includes and so I wonder how it worked at alL! the command line I used<br>
> was:<br>
<br>
Declarations from foreign_decl pragmas and alike are placed in a Mercury<br>
header file (.mh) and #included in generated .c files.  Look for the file<br>
<a href="http://ffi.mh" rel="noreferrer" target="_blank">ffi.mh</a>.  The contents of the foreign_decl pragmas should be in that.<br>
<br>
>      mmc -v -L /usr/lib/x86_64-linux-gnu/libSDL2.so -lSDL2 --make ffi<br>
<br>
It looks as though the C compiler can't see the SDL header files.<br>
You can use the Mercury compiler's --c-include-directory option to pass<br>
their location through to the C compiler.<br>
<br>
Julien.</blockquote></div>