我已经构建了一些玩具C++库来快速地从Lisp创建一个Qt窗口。我知道普通的-qt是存在的,我只是想学习如何使用cffi。
现在,我有4个绑定函数:
下面是一个完美工作的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谢谢。
发布于 2013-07-13 07:08:32
我建议你做以下几点:
extern "C"声明--这些声明是确保C++编译器不会损坏名称所必需的。UPD:
我试过运行您的代码,也发生了同样的崩溃。问题似乎在您的create_application函数中。我已经在http://paste.lisp.org/display/138049上附加了这个函数的固定版本。
具体而言,有两个问题:
create_application在堆栈上分配了v。后续代码(即let绑定)覆盖它。argv应该是NULL-terminated。也就是说,它应该包含argc+1元素--最后一个元素是NULL。(Qt似乎不使用这个,但是根据规范编写代码是个好习惯)。在您的示例中,堆栈分配是一个问题-- let绑定似乎覆盖了堆栈上的v值,从而使SBCL崩溃。使用malloc或new在堆上分配argv解决了这个问题。
https://stackoverflow.com/questions/17582216
复制相似问题