chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-users] creating shared libraries from two files chicken-bind /


From: David Dreisigmeyer
Subject: [Chicken-users] creating shared libraries from two files chicken-bind / swig
Date: Wed, 15 Dec 2010 14:58:55 -0500

Hello,

I've been trying to get the swig example with two modules to work, and
wanted to compare that to using chicken-bind.  I did get it to work
with swig, but I'm stuck when I use chicken-bind.  (I'm not sure if
chicken bind is the best tool to use here.)  My code's below.

Thanks again,

-Dave


--------------------------------------------
********************************************
--------------------------------------------

Using two modules:
--------------------------------------------
// File : example1_impl.c
// **** NOTE THAT THERE ARE NO UNDERSCORES IN THE NAMES ****

/* Compute n mod m */
int mymod(int n, int m) {
  return(n % m);
}
--------------------------------------------
/* File : example1.i */
// **** NOTE THAT THERE ARE NO UNDERSCORES IN THE NAMES ****
// **** THE VARIABLES ARE TREATED AS PROCEDURES: ****
// **** USE (var) TO ACCESS THEIR VALUES ****
%module example1
%{
  /* Put headers and other declarations here */
  extern int    mymod(int n, int m);
  %}

extern int    mymod(int n, int m);
--------------------------------------------
// File : example2_impl.c
// **** NOTE THAT THERE ARE NO UNDERSCORES IN THE NAMES ****

double  myvariable  = 3.0;

/* Compute factorial of n */
int  fact(int n) {
  if (n <= 1) return 1;
  else return n*fact(n-1);
}
--------------------------------------------
/* File : example2.i */
// **** NOTE THAT THERE ARE NO UNDERSCORES IN THE NAMES ****
// **** THE VARIABLES ARE TREATED AS PROCEDURES: ****
// **** USE (var) TO ACCESS THEIR VALUES ****
%module example2
%{
  /* Put headers and other declarations here */
  extern double myvariable;
  extern int    fact(int);
  %}

extern double myvariable;
extern int    fact(int);
--------------------------------------------
;;; examples_load.scm
(declare (uses example1))
(declare (uses example2))
--------------------------------------------

Then run:
> swig -chicken example1.i && swig -chicken example2.i
> csc -sv examples_load.scm example1.scm example2.scm example1_wrap.c 
> example2_wrap.c \
        example1_impl.c example2_impl.c -o examples.so
> csi
#;1> (load-library 'example1 "examples.so")
; loading library example1 ...
#t
#;2> (load-library 'example2 "examples.so")
; loading library example2 ...
#t
#;3> myvariable
#<procedure>
#;4> (myvariable)
3.0
#;5> (fact 5)
120
#;6> (mymod 2 3)
2
#;7> (mymod 3 2)
1

--------------------------------------------

For chicken-bind I can run:

> chicken-bind example1_impl.c -o example1.scm
> csc -sv example1.scm example1_impl.c
> csi
#;1> ,l 
/Users/daviddreisigmeyer/Programming/scheme/chicken/swig/chicken-bind/example1.so
; loading 
/Users/daviddreisigmeyer/Programming/scheme/chicken/swig/chicken-bind/example1.so
...
#;1> (mymod 2 3)
2

But if I try something like:

> chicken-bind example1_impl.c -o example1.scm && chicken-bind example2_impl.c 
> -o example2.scm
> csc -cv example1.scm example1_impl.c -C -fPIC -C -c
> csc -cv example2.scm example2_impl.c -C -fPIC -C -c
> gcc -shared -o examples.so *.o
ld: duplicate symbol _C_toplevel in example2.o and example1.o
collect2: ld returned 1 exit status


--------------------------------------------

Note that the intermediate swig generated *.scm files are:
--------------------------------------------

example1.scm

;; -*- buffer-read-only: t -*- vi: set ro:
;; This file was created automatically by SWIG.
;; Don't modify this file, modify the SWIG interface instead.
(declare (unit example1))

(declare
    (hide swig-init swig-init-return)
    (foreign-declare "C_extern void
swig_example1_init(C_word,C_word,C_word) C_noret;"))
(define swig-init (##core#primitive "swig_example1_init"))
(define swig-init-return (swig-init))
--------------------------------------------

example2.scm

;; -*- buffer-read-only: t -*- vi: set ro:
;; This file was created automatically by SWIG.
;; Don't modify this file, modify the SWIG interface instead.
(declare (unit example2))

(declare
    (hide swig-init swig-init-return)
    (foreign-declare "C_extern void
swig_example2_init(C_word,C_word,C_word) C_noret;"))
(define swig-init (##core#primitive "swig_example2_init"))
(define swig-init-return (swig-init))


--------------------------------------------
********************************************
--------------------------------------------



reply via email to

[Prev in Thread] Current Thread [Next in Thread]