用C代码实现一个DLL,可以用VC创建一个工程,让它生成lispcall.dll,导出一个整形变量和一个函数,函数里面随便写点什么。
LISPC_API extern int x;
LISPC_API int f(int v) { return v*v; }
再创建一个LISP源文件,写上下面代码
(defpackage ffi-test (:use common-lisp ffi))
(in-package ffi-test)
(default-foreign-language :stdc)
(def-c-var cx (:name "x") (:type int)
(:library "lispcall\\lispcall.dll"))
(def-call-out cf (:name "f")
(:arguments (v int))
(:return-type int)
(:library "lispcall\\lispcall.dll"))
在LISP命令行中加载上面LISP代码,没有报错。为了表明DLL其作用,可以在LISP代码后面加上下面内容,再加载时就能看到错误:FFI::FIND
-FOREIGN-FUNCTION: no dynamic object named "g" in library "lispcall\\lispcall.dll".
(def-call-out cg (:name "g")
(:arguments)
(:return-type nil)
(:library "lispcall\\lispcall.dll"))
现在来测试一