On Tue, Mar 8, 2011 at 10:30 AM, David Lichteblau david@lichteblau.comwrote:
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/cff...
At any rate, I can run the tutorial code, so thanks for the help :-).