[Top][All Lists]
[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))
--------------------------------------------
********************************************
--------------------------------------------
- [Chicken-users] creating shared libraries from two files chicken-bind / swig,
David Dreisigmeyer <=