On Tue, Mar 8, 2011 at 10:30 AM, David Lichteblau <david@lichteblau.com> wrote:
Quoting Elliott Slaughter (elliottslaughter@gmail.com):
> Undefined symbols:
>   "Smoke::classMap", referenced from:
>       Smoke::findClass(char const*)in commonqt.o
>       Smoke::findClass(char const*)in commonqt.o
>   "Smoke::NullModuleIndex", referenced from:
>       Smoke::idMethod(short, short)in commonqt.o
>       Smoke::idClass(char const*, bool)in commonqt.o
>       Smoke::idClass(char const*, bool)in commonqt.o
>       Smoke::idMethodName(char const*)in commonqt.o
>       Smoke::findClass(char const*)in commonqt.o
> ld: symbol(s) not found
> collect2: ld returned 1 exit status
> make: *** [libcommonqt.1.0.0.dylib] Error 1

Just a shot in the dark, but I had a linking error on Windows, because
CommonQt still links to smokeqtcore, and actually needs smokebase.

Does it help if you change s/smokeqtcore/smokebase/ in commonqt.pro
before re-running qmake?

Yup, that fixed the link error.

I have a couple of quibbles about the way you load foreign libraries. The first is that you hard code the .so extension for non-unix platforms. Mac OS X uses a .darwin extension. Here's a minimal fix for that:

diff --git a/ffi.lisp b/ffi.lisp
index 36a4a99..0dd1fc0 100755
--- a/ffi.lisp
+++ b/ffi.lisp
@@ -34,10 +34,14 @@
 
 (defun load-libcommonqt ()
   (cffi:load-foreign-library
-   #-(or windows mswindows win32)
+   #-(or windows mswindows win32 darwin)
    (namestring (merge-pathnames "libcommonqt.so"
                                 (asdf::component-relative-pathname
                                  (asdf:find-system :qt))))
+   #+(or darwin)
+   (namestring (merge-pathnames "libcommonqt.dylib"
+                                (asdf::component-relative-pathname
+                                 (asdf:find-system :qt))))
    #+(or windows mswindows win32)
    (namestring (merge-pathnames "debug/commonqt.dll"
                                 (asdf::component-relative-pathname
diff --git a/info.lisp b/info.lisp
index 6615e82..dcb9b52 100755
--- a/info.lisp
+++ b/info.lisp
@@ -696,7 +696,8 @@
         #+debug (assert (< idx (length *module-table*)))
         (cffi:load-foreign-library
         (format nil
-                #-(or mswindows windows win32) "libsmoke~A.so"
+                #-(or mswindows windows win32 darwin) "libsmoke~A.so"
+                #+(or darwin) "libsmoke~A.dylib"
                 #+(or mswindows windows win32) "smoke~A.dll"
                 name))
         (let ((init (cffi:foreign-symbol-pointer

But beyond that basic issue, you don't take advantage of CFFI's *foreign-library-directories* feature, which is going to make it difficult for me to relocate the shared libraries. For example, if I wanted to save a core and distribute it as a binary, I don't think I'll be able to do that easily with this setup.

For an example of how to do this look at lispbuilder-sdl's ffi code, especially around lines 9 and 27.

http://code.google.com/p/lispbuilder/source/browse/trunk/lispbuilder-sdl/cffi/library.lisp

At any rate, I can run the tutorial code, so thanks for the help :-).

--
Elliott Slaughter

"Don't worry about what anybody else is going to do. The best way to predict the future is to invent it." - Alan Kay