Как включить библиотеку C в Forth - PullRequest
0 голосов
/ 26 декабря 2018

По умолчанию в Forth есть только небольшое количество рабочих библиотек, поэтому все должно быть запрограммировано с нуля.Причина в том, что основанная на стеке виртуальная машина Forth идентифицирует себя как тонкая система.

Согласно руководству Gforth, можно использовать существующие библиотеки C и получать доступ к предварительно скомпилированным графическим библиотекам и игровым движкам, написанным на CПрежде чем можно будет включить библиотеку C в Forth, хорошей идеей будет протестировать библиотеку в обычном проекте C.

Я создал библиотеку в C с нуля.Он предоставляет функцию добавления и может вызываться из основной программы.Файлы скомпилированы и связаны, и это прекрасно работает.

### add.c ###
int add(int a, int b) {
  return a + b;
}
### add.h ###
int add(int, int);

### main.c ###
#include <stdio.h>
#include "add.h"
void main() {
  printf("5 + 7 = %d\n", add(5,7));
}

### compile ###
gcc -c -fPIC add.c
gcc -c main.c
gcc main.o add.o
./a.out
5 + 7 = 12

Планируется использовать эту предварительно скомпилированную c-библиотеку из Forth.Для этой цели компилятор Gforth предоставляет специальное ключевое слово, которое связывает программу Forth с библиотекой C.К сожалению, я получаю сообщение об ошибке, в котором говорится, что библиотека не найдена.Даже после копирования его вручную в папку Gforth, сообщение об ошибке не исчезает.

### Forth source code ###
\c #include "add.h"
c-function add add n n -- n
5 7 add .
bye

### Execution ###
gforth "main.fs"
/home/user1/.gforth/libcc-tmp/gforth_c_7F5655710258.c:2:10: fatal error: add.h: No such file or directory
 #include "add.h"
          ^~~~~~~
compilation terminated.

in file included from *OS command line*:-1
b.fs:3: libtool compile failed
5 7 >>>add<<< .
Backtrace:
$7F56556BD988 throw
$7F56556F9798 c(abort")
$7F56556F9F08 compile-wrapper-function

gforth: symbol lookup error: /home/user1/.gforth/libcc-tmp/.libs/gforth_c_7F0593846258.so.0: undefined symbol: add

### Copy missing file and execute again ###
cp add.h /home/user1/.gforth/libcc-tmp/
gforth "main.fs"
gforth: symbol lookup error: /home/user1/.gforth/libcc-tmp/.libs/gforth_c_7F5256AC2258.so.0: undefined symbol: add

Что не так с «интерфейсом Forth-to-C»?

1 Ответ

0 голосов
/ 26 декабря 2018

Вы должны объявить add как функцию для экспорта, скомпилировать ее как общую библиотеку (например, libadd.so) и добавить эту библиотеку, используя слово add-lib, см. Объявление уровня ОСбиблиотеки .

s" add" add-lib

Примечание: префикс 'lib' и суффикс '.so' добавляются автоматически.

...