我已经构建了一些玩具 C++ 库来从 Lisp 快速创建一个 Qt 窗口。我知道 common-qt 存在,我只是想学习如何使用 cffi。
现在,我有 4 个绑定函数:
- create-application :创建一个 QApplication 并返回一个指针
- create-window : 创建一个 QMainWindow 并返回一个指针
- show :显示指定为参数的窗口
- exec : Qt 执行函数
这是一个完美运行的 lisp 代码:
(defctype t-app :pointer)
(defctype t-window :pointer)
(defcfun (create-application "create_application" ) t-app)
(defcfun (exec "exec") :void (app t-app))
(defcfun (create-window-aalt "create_window_aalt") t-window)
(defcfun (show "show") :void (o t-window))
(defparameter a (create-application))
(defparameter w (create-window-aalt))
(show w)
(exec a)
但是如果我使用 LET 或 LET*...我有内存错误!
(let* ((a (create-application)) (w (create-window-aalt)))
(show w)
(exec a))
CORRUPTION WARNING in SBCL pid 1312(tid 140737353860992):
Memory fault at a556508 (pc=0x7ffff659b7f1, sp=0x7ffff2bbe688)
The integrity of this image is possibly compromised.
Exiting.
有人知道为什么吗?
我正在使用 SBCL:
env LD_LIBRARY_PATH=`pwd` \
env LD_PRELOAD=/usr/lib/libQtGui.so.4 \
sbcl --script aalt.lisp
谢谢。