Bill Allombert on Tue, 30 Aug 2005 16:21:13 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: pari & c++ |
On Fri, Aug 26, 2005 at 06:12:49PM -0400, Sam Steingold wrote: > when pari is built with C on cygwin > but used with C++, I get the following linking error: > > pari.o: In function `_Z13get_entry_docPc': > pari.c:13: undefined reference to `dowin32ctrlc()' > > here is line 13 in file pari.c: > > char* get_entry_doc (char* s) { entree *e = is_entry(s); return e==NULL?NULL:e->help; } Hello, I do not have a cygwin system to check, but the patch below should fix this bug. Thanks for your report! I am afraid there are lots of similar bugs (missing extern "C"). If we want to support libpari build with g++ we need to declare _every_ public symbols (functions or variables) as extern "C", else the resulting library does not define the same symbols (due to mangling) so has a different ABI from the standard one. We should probably wrap definitions of global symbol with a macro. Alternatively we can define _every_ public functions in either paripriv.h or paridecl.h. Cheers, Bill Index: pari/src/headers/parisys.h =================================================================== --- pari.orig/src/headers/parisys.h 2004-11-08 12:30:32.000000000 +0100 +++ pari/src/headers/parisys.h 2005-08-30 10:32:30.000000000 +0200 @@ -63,6 +63,8 @@ * the SIGINT handler. On Win32, the handler is executed in another thread, and * longjmp'ing into another thread's stack will utterly confuse the system. * Instead, we check whether win32ctrlc is set in new_chunk(). */ +BEGINEXTERN extern int win32ctrlc; void dowin32ctrlc(); +ENDEXTERN #endif