* Ported the C++ examplesto the shared object dynamic linking scheme.
git-svn-id: svn://svn.zoy.org/elk/trunk@14 55e467fa-43c5-0310-a8a2-de718669efc6
This commit is contained in:
parent
074467d7f1
commit
29a718f477
|
@ -6,13 +6,13 @@ Scheme primitives.
|
|||
|
||||
See constructor.c in this directory for compilation instructions.
|
||||
|
||||
Here is a transcript showing a test run under Solaris 2.4 using the
|
||||
Here is a transcript showing a test run under Linux using the
|
||||
GNU g++ compiler:
|
||||
|
||||
% g++ -fpic -I/usr/elk/include -c class.c
|
||||
% g++ -shared -fPIC -I/usr/elk/include -c class.c -o class.so
|
||||
%
|
||||
% scheme
|
||||
> (load 'class.o)
|
||||
> (load 'class.so)
|
||||
|
||||
> (define x (make-foo))
|
||||
x
|
||||
|
@ -23,7 +23,7 @@ GNU g++ compiler:
|
|||
> (read-val x)
|
||||
11
|
||||
> (exit)
|
||||
%
|
||||
%
|
||||
|
||||
-----------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -72,18 +72,20 @@ Object P_Write_Val(Object x, Object y) {
|
|||
return Void;
|
||||
}
|
||||
|
||||
Foo_Print(Object h, Object port, int raw, int depth, int length) {
|
||||
int Foo_Print(Object h, Object port, int raw, int depth, int length) {
|
||||
Printf(port, "#[foo %d]", FOO(h)->foo.read_val());
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Foo_Equal(Object x, Object y) {
|
||||
return FOO(x)->foo.read_val() == FOO(y)->foo.read_val();
|
||||
}
|
||||
|
||||
void elk_init_foo() {
|
||||
extern "C" void elk_init_foo() {
|
||||
T_Foo = Define_Type(0, "foo", NOFUNC, sizeof(struct S_Foo),
|
||||
Foo_Equal, Foo_Equal, Foo_Print, NOFUNC);
|
||||
Define_Primitive((Object(*)(...))P_Make_Foo, "make-foo", 0, 0, EVAL);
|
||||
Define_Primitive((Object(*)(...))P_Read_Val, "read-val", 1, 1, EVAL);
|
||||
Define_Primitive((Object(*)(...))P_Write_Val, "write-val!", 2, 2, EVAL);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,24 +3,13 @@
|
|||
This simple C++ program demonstrates that static constructors (destructors)
|
||||
are invoked by Elk when loading a compiled C++ file (when exiting).
|
||||
|
||||
o Compile the program with CC -c -I/usr/elk/include constructor.c, where
|
||||
/usr/elk is the toplevel directory of your Elk installation. Under
|
||||
Solaris 2.x (and SysVR4) you also have to specify -pic (-fpic for g++).
|
||||
o Compile the shared object, for instance:
|
||||
|
||||
o Invoke Elk and set the load-libraries to point to the C++ and the
|
||||
C library, e.g. type something like:
|
||||
CC -pic -shared -I/usr/elk/include constructor.c -o constructor.so
|
||||
|
||||
(set! load-libraries "-L/usr/lang/SC2.0.1 -lC -lc")
|
||||
or
|
||||
(set! load-libraries "-R/usr/lang/lib -L/usr/lang/lib -lC -lc")
|
||||
or just
|
||||
(set! load-libraries "-lC -lc")
|
||||
|
||||
depending on the platform and the place where the C++ library has
|
||||
been installed on your system. If you are using g++, you may have
|
||||
to mention both the g++ library and the gcc library.
|
||||
g++ -fPIC -shared -I/usr/include/elk constructor.c -o constructor.so
|
||||
|
||||
o Now "(load 'constructor.o)", observe the "invoking constructor" message,
|
||||
o Now "(load 'constructor.so)", observe the "invoking constructor" message,
|
||||
and evaluate "(test)", which should return 3. Terminate the interpreter
|
||||
and observe the "invoking destructor" message.
|
||||
|
||||
|
@ -47,16 +36,16 @@ o If static constructors don't get called when loading compiled C++ files,
|
|||
|
||||
#include "scheme.h"
|
||||
|
||||
#include <iostream.h>
|
||||
#include <iostream>
|
||||
|
||||
class C {
|
||||
public:
|
||||
int i;
|
||||
C() {
|
||||
cerr << "[invoking constructor]" << endl;
|
||||
std::cerr << "[invoking constructor]" << std::endl;
|
||||
i = 3;
|
||||
}
|
||||
~C() { cerr << "[invoking destructor]" << endl; }
|
||||
~C() { std::cerr << "[invoking destructor]" << std::endl; }
|
||||
};
|
||||
|
||||
C c;
|
||||
|
@ -65,10 +54,10 @@ Object P_Test() {
|
|||
return Make_Integer(c.i);
|
||||
}
|
||||
|
||||
void elk_init_constructor() {
|
||||
extern "C" void elk_init_constructor() {
|
||||
Define_Primitive((Object (*)(...))P_Test, "test", 0, 0, EVAL);
|
||||
}
|
||||
|
||||
void elk_finit_constructor() {
|
||||
cerr << "Goodbye." << endl;
|
||||
extern "C" void elk_finit_constructor() {
|
||||
std::cerr << "Goodbye." << std::endl;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue