Lisp から Qt ウィンドウをすばやく作成するために、おもちゃの C++ ライブラリを作成しました。common-qt が存在することは知っていますが、cffi の使用方法を学ぼうとしています。
現在、バインドされた関数が 4 つあります。
- create-application : QApplication を作成し、ポインタを返します
- create-window : QMainWindow を作成し、ポインタを返します
- show : 引数として指定されたウィンドウを表示します
- exec : Qt exec 関数
完全に動作する 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
ありがとう。