This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi, Has anyone had dynamic linking support working for guile in a recent snapshot? I have a snapshot from June 15th, and an apparently correct input is failing in mysterious ways. I'm running linux 2.0.0... After much confusion, the problem appears to be somewhere in the libguile C code. My init_module function is being called, and it calls scm_register_module_xxx, but when c-registered-modules is called, it returns no modules. I believe this also happened with a snapshot from about a month ago, but not with one from about a year ago... Andrew Here's my input: cat learn2.c << EOF #include <math.h> #include <guile/gh.h> #include <libguile.h> /* @r{this is a factorial routine in C, made to be callable by Scheme} */ SCM c_factorial(SCM s_n) { int i; unsigned long result = 1, n; n = gh_scm2ulong(s_n); gh_defer_ints(); for (i = 1; i <= n; ++i) { result = result*i; } gh_allow_ints(); return gh_ulong2scm(result); } /* @r{a sin routine in C, callable from Scheme. it is named c_sin() to distinguish it from the default Scheme sin function} */ SCM c_sin(SCM s_x) { double x = gh_scm2double(s_x); return gh_double2scm(sin(x)); } /* @r{play around with vectors in Guile: this routine creates a vector of the given length, initializes it all to zero except element 2 which is set to 1.9.} */ SCM vector_test(SCM s_length) { SCM xvec; printf("requested length for vector: %ld\n", gh_scm2ulong(s_length)); /* create a vector */ xvec = gh_make_vector(s_length, gh_double2scm(0.0)); /* set the second element in it */ gh_vector_set_x(xvec, gh_int2scm(2), gh_double2scm(1.9)); return xvec; } /* @r{now try to define some new builtins, coded in C, so that they are available in Scheme.} */ void init_learn2() { printf("initializing module\n"); fflush(stdout); gh_new_procedure1_0("c-factorial", c_factorial); gh_new_procedure1_0("c-sin", c_sin); gh_new_procedure1_0("v-t", vector_test); } /* @r{This function has a magic name so guile knows to call it upon loading this module.} */ void scm_init_tut_learn2_module () { printf("registering module\n"); fflush(stdout); scm_register_module_xxx ("tut learn2", init_learn2); } EOF cat test.scm <<EOF (debug-enable 'backtrace) (assert-repl-verbosity #t) (display "Beginning traces...\n") (trace resolve-module try-module-dynamic-link) (trace find-and-link-dynamic-module init-dynamic-module) (trace try-using-libtool-name try-using-sharlib-name) (trace link-dynamic-module dynamic-call save-module-excursion) ;(trace set-module-public-interface! set-current-module) (trace convert-c-registered-modules split-c-module-name) (trace c-registered-modules c-clear-registered-modules) (display registered-modules) (use-modules (tut learn2)) (display registered-modules) EOF gcc -fPIC -c learn2.c gcc -o liblearn2.so -shared learn2.o -lguile -lqthreads -lm mkdir tut cp liblearn2.so tut guile <test.scm guile> (stack 20000 debug backtrace depth 20 maxdepth 1000 frames 3 indent 10 procnames cheap) guile> ;;; 420 msec (390 msec in gc) guile> Beginning traces... ;;; 10 msec (0 msec in gc) guile> (resolve-module try-module-dynamic-link) ;;; 250 msec (0 msec in gc) guile> (find-and-link-dynamic-module init-dynamic-module) ;;; 150 msec (0 msec in gc) guile> (try-using-libtool-name try-using-sharlib-name) ;;; 140 msec (0 msec in gc) guile> (link-dynamic-module dynamic-call save-module-excursion) ;;; 190 msec (0 msec in gc) guile> (convert-c-registered-modules split-c-module-name) ;;; 160 msec (380 msec in gc) guile> (c-registered-modules c-clear-registered-modules) ;;; 170 msec (0 msec in gc) guile> ();;; 40 msec (0 msec in gc) guile> [resolve-module (tut learn2)] | [init-dynamic-module (tut learn2)] | #f | [resolve-module (tut) #f] | #<directory tut 40166d00> | [try-module-dynamic-link (tut learn2)] | | [find-and-link-dynamic-module (tut learn2)] | | | [try-using-libtool-name "/usr/local/share/guile/site/tut/" "liblearn2"] | | | | [resolve-module (ice-9 regex)] | | | | #<directory regex 401571f0> | | | #f | | | [try-using-sharlib-name "/usr/local/share/guile/site/tut/" "liblearn2"] | | | "/usr/local/share/guile/site/tut/liblearn2.so" | | | [try-using-libtool-name "/usr/local/share/guile/1.3a/tut/" "liblearn2"] | | | | [resolve-module (ice-9 regex)] | | | | #<directory regex 401571f0> | | | #f | | | [try-using-sharlib-name "/usr/local/share/guile/1.3a/tut/" "liblearn2"] | | | "/usr/local/share/guile/1.3a/tut/liblearn2.so" | | | [try-using-libtool-name "/usr/local/share/guile/tut/" "liblearn2"] | | | | [resolve-module (ice-9 regex)] | | | | #<directory regex 401571f0> | | | #f | | | [try-using-sharlib-name "/usr/local/share/guile/tut/" "liblearn2"] | | | "/usr/local/share/guile/tut/liblearn2.so" | | | [try-using-libtool-name "./tut/" "liblearn2"] | | | | [resolve-module (ice-9 regex)] | | | | #<directory regex 401571f0> | | | #f | | | [try-using-sharlib-name "./tut/" "liblearn2"] | | | "./tut/liblearn2.so" | | [link-dynamic-module "./tut/liblearn2.so" "scm_init_tut_learn2_module"] | | | [dynamic-call "scm_init_tut_learn2_module" #<dynamic-object "./tut/liblearn2.so">] registering module | | | #<unspecified> | | | [convert-c-registered-modules #<dynamic-object "./tut/liblearn2.so">] | | | | [c-registered-modules] | | | | () | | | | [c-clear-registered-modules] | | | | #<unspecified> | | | () | | #<unspecified> | [init-dynamic-module (tut learn2)] | #f #<directory learn2 40145850> Backtrace: 0* (use-modules (tut learn2)) 1 [process-use-modules ((tut learn2))] 2 [for-each #<procedure (module-name)> ((tut learn2))] 3* [#<procedure (module-name)> (tut learn2)] 4* (let ((mod-iface #)) (or mod-iface (error "no such module" module-name)) ...) 5* (or mod-iface (error "no such module" module-name)) 6 [error "no such module" (tut learn2)] ERROR: In procedure error in expression (error "no such module" module-name): ERROR: no such module (tut learn2) ABORT: (misc-error) guile> ();;; 70 msec (0 msec in gc) guile> ;;; EOF -- quitting ;;; QUIT executed, repl exitting ;;; 470 msec (0 msec in gc)