Mail Archives: cygwin/2005/01/20/18:01:50
Thanks for the help re building DLL's with g++. I have DLLs which I
can build and link with my main code. But the DLLs seem to have
separate variables...how do I load a DLL so that it uses the same
'namespace' as my main code?
Here is a simple example I've built up. The main function calls the
hello function inside a dll, and hello increments a static 'value'
variable from 3 to 4. But in the main function, the value variable,
also defined, still remains at 3.
How do I get the GOOD output from running './main.exe'?
Thanks!
~David Svoboda
==> foo.C <==
int value = 3;
void inc() {
value++;
}
==> foo.h <==
extern int value;
void inc();
==> hello.C <==
#include <stdio.h>
#include "foo.h"
extern "C" {
int hello(void*);
}
int hello(void* name) {
printf("Hello, %s!\n", (char*) name);
printf("In hello, Value is %d\n", value);
inc();
printf("In hello, Value is %d\n", value);
return 0;
}
==> main.C <==
#include <stdio.h>
#include "foo.h"
extern "C" {
int dlopen(char*);
int dlsym( int, char*);
int dlclose( int);
char* dlerror();
}
typedef void (*func_t)(const void*);
int main() {
int handle;
int fn;
if ((handle = dlopen("hello.dll")) == 0)
printf( "dlopen: can't open libhello.dll\n");
if ((fn = dlsym( handle, "hello")) == 0)
printf("dlsym: can't open hello()\n");
func_t f = (func_t) fn;
printf("In main, Value is %d\n", value);
f("Dave");
printf("In main, Value is %d\n", value);
inc();
printf("In main, Value is %d\n", value);
return 0;
}
==> Makefile <==
all: main.exe hello.dll
clean:
rm *# *~ *.o *.dll *.exe *.stackdump || true
main.exe: main.o foo.o
g++ -o main.exe main.o foo.o
hello.dll: hello.o foo.o
g++ -shared -o hello.dll hello.o foo.o
==> output_bad <==
In main, Value is 3
Hello, Dave!
In hello, Value is 3
In hello, Value is 4
In main, Value is 3
In main, Value is 4
==> output_good <==
In main, Value is 3
Hello, Dave!
In hello, Value is 3
In hello, Value is 4
In main, Value is 4
In main, Value is 5
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -