* 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
 | 
			
		||||
| 
						 | 
				
			
			@ -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")
 | 
			
		||||
     g++ -fPIC -shared -I/usr/include/elk constructor.c -o constructor.so
 | 
			
		||||
 | 
			
		||||
   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.
 | 
			
		||||
 | 
			
		||||
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