默认情况下,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
计划是使用来自Forth的此预编译c库。为此,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界面”出了什么问题?
答案 0 :(得分:4)
您必须将add
声明为导出函数,将其编译为共享库(例如libadd.so
),并使用add-lib
词添加此库,请参见 { {3}} 。
s" add" add-lib
注意:前缀'lib'和后缀'.so'是自动添加的。