Fil*_*ppo 6 lisp pointers sbcl let cffi
我已经构建了一些玩具C++库来快速创建一个来自Lisp的Qt窗口.我知道common-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)
Run Code Online (Sandbox Code Playgroud)
但如果我使用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.
Run Code Online (Sandbox Code Playgroud)
有人知道为什么吗?
我正在使用SBCL:
env LD_LIBRARY_PATH=`pwd` \
env LD_PRELOAD=/usr/lib/libQtGui.so.4 \
sbcl --script aalt.lisp
Run Code Online (Sandbox Code Playgroud)
谢谢.
我建议您执行以下操作:
由于您正在编写 C++ 库并使用 Lisp 中的符号,因此请确保使用extern "C"声明 - 这些声明是确保 C++ 编译器不会破坏名称所必需的。
检查您的库是否可以在 C(而非 C++)应用程序中运行。这将确保库本身正常工作(例如,它不会抛出 C++ 异常)。
更新:
我尝试运行你的代码并遇到了同样的崩溃。问题似乎出在你的create_application功能上。我已在http://paste.lisp.org/display/138049附加了此函数的修复版本。
具体来说,有2个问题:
create_application分配v在堆栈上。后续代码(即let绑定)将覆盖它。
argv应NULL终止。即,它应该包含argc+1元素 - 最后一个元素为 NULL。(Qt似乎没有使用这个,但按照规范编写代码是个好习惯)。
在您的情况下,堆栈分配是问题所在 - 绑定似乎let覆盖了堆栈上的值v,导致 SBCL 崩溃。使用malloc或在堆上new分配可以修复此问题。argv