Я пытаюсь использовать Raylib (https://www.raylib.com/, https://github.com/raysan5/raylib) из кода Racket через FFI. Вот самый простой пример:
#lang racket
(require ffi/unsafe
ffi/unsafe/define)
; raylib shared object must be available for Racket
; for example, in Linux it must be in
; ~/.racket/<racket-version>/lib> or /usr/lib/racket
(define-ffi-definer define-raylib (ffi-lib "libraylib" #:global? #t))
(define-raylib BeginDrawing (_fun -> _void))
(define-raylib CloseWindow (_fun -> _void))
(define-raylib EndDrawing (_fun -> _void))
(define-raylib InitWindow (_fun _int _int _string -> _void))
(define-raylib SetTargetFPS (_fun _int -> _void))
(define-raylib WindowShouldClose (_fun -> _int))
(void InitWindow 640 480 "Test window")
(void SetTargetFPS 60)
(define (main-loop)
(BeginDrawing)
(EndDrawing)
(if (= (WindowShouldClose) 0)
(main-loop)
(CloseWindow)))
(main-loop)
Но даже этот очень простой пример вылетает с сообщением:
SIGSEGV MAPERR si_code 1 fault on addr (nil)
Aborted (core dumped)
Похоже, что происходит сбой при вызове функции BeginDrawing()
. Код этой функции также очень прост:
// Setup canvas (framebuffer) to start drawing
void BeginDrawing(void)
{
currentTime = GetTime(); // Number of elapsed seconds since InitTimer()
updateTime = currentTime - previousTime;
previousTime = currentTime;
rlLoadIdentity(); // Reset current matrix (MODELVIEW)
rlMultMatrixf(MatrixToFloat(downscaleView)); // If downscale required, apply it here
}
Функции с префиксом rl
являются оболочками OpenGL. Может ли это быть проблемой контекста OpenGL?
Я попытался вызвать те же функции в схеме Guile, и в Guile все прекрасно работает.