On Tue, Mar 8, 2011 at 10:30 AM, David Lichteblau <david@lichteblau.com> wrote:
> 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