This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Building DLL's using g++, not gcc


Hi,

The way symbol names are built in dll differs if they are related to c call convention or to c++ call, and that could be your problem. When compiling hello.c with gcc, your exported symbol corresponds to C calling convention.

When compiling dll with g++, you should declare your exported function as 'extern "C"' in hello.c.

David Marteau

svoboda@cs.cmu.edu wrote:

I've been trying to build a DLL using g++, and given the problems I was having, I decided to try a 'toy' example, which is available at:
http://cygwin.com/cygwin-ug-net/dll.html
I tweaked the two files around thusly:



hello.C: ----- #include <stdio.h> int hello() { printf("Hello World\n");} -----

main.C:
-----
#include <stdio.h>
typedef void (*fn_type)();

extern "C" {
 int dlopen(char*);
 int dlsym( int, char*);
}

int main() {
 int handle = 0;
 fn_type fn = 0;
 if ((handle = dlopen( "hello.dll")) == 0) {
   printf( "Cannot open hello.dll\n");
 }
 if ((fn = (fn_type) dlsym( handle, "hello")) == 0) {
   printf( "Cannot open hello()\n");
 }
 fn();
}
-----

This way, hello.C is a valid C or C++ application, and main.C is a
valid C++ application. I build main.exe by:

g++ -o main main.C

If I build hello.dll this way, it works:

	gcc -shared -o hello.dll hello.C
	./main
	Hello world!

But if I build hello.dll this way, it doesn't work:

	g++ -shared -o hello.dll hello.C
	./main
	bash: [2084: 2] testaddr: Inappropriate ioctl for device

Why? What am I doing wrong?

~David Svoboda






-- 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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]