[fpc-pascal] Linking using "external" on Mac OS X

Jonas Maebe jonas.maebe at elis.ugent.be
Wed Mar 28 22:09:37 CEST 2007


On 28 mrt 2007, at 21:46, Michalis Kamburelis wrote:

> I experience problems linking using "external" keyword on Mac OS X.  
> Program with declaration like
>
> procedure glVertex3f(x, y, z: Single); cdecl; external 'GL' name  
> 'glVertex3f';
>
> fails to compile with
>
> $ fpc external_decl.pas
> /usr/bin/ld: Undefined symbols:
> _glVertex3f
> Error: Error while linking
>
> (note the strange underscore at the beginning of reported  
> "_glVertex3f").

There's nothing strange about the underscore. On Mac OS X, all  
external C symbols have an automatically prepended underscore (just  
like on e.g. Dos/go32v2, for example). Whether or not this is done  
depends on the platform's conventions.

> Similar problems seem to arise with gtkglext unit under Mac OS X.  
> What's interesting is that the problems are gone if I add {$linklib  
> GL} (in case of glVertex3f example). So it seems to me that  under  
> Mac OS X
> 1. the name of the library specified after "external" keyword is  
> ignored
> 2. I have to link to libraries using {$linklib xxx} method

That's correct. I did this in the beginning because almost many  
library names used in the sources we distribute are wrong for Mac OS  
X, and didn't feel like cleaning those up everywhere. I never got  
around to actually changing all those names into symbolic constants  
which are properly defined based on the platform and then enabling  
parsing of the library names in external definitions for Mac OS X.  
It's a fairly large and annoying task (modify and then test as many  
platforms as possible to make sure you didn't accidentally break  
another platform in the process).

> This is what gtk2 unit uses, and it links OK with GTK library from  
> fink. Also construct like
> function sem_post(__sem:Pointer): LongInt; cdecl; external 'c' name  
> 'sem_post';
> works OK in FPC's RTL, I guess that somewhere in Darwin RTL there's  
> included {$linklib c}.

The entire Darwin RTL is based on libc, because that is the only  
supported system interface by Apple.

As an aside: it is a bad idea to manually define sem_post and  
friends, because even if you do not get a linking error, some of  
these functions may not be implemented (e.g. in Mac OS X < 10.4,  
sem_init/sem_destroy both return ENOSYS (function not implemented),  
and you have to use sem_open/sem_unlink/sem_close instead). Better  
use TRTLEvent instead, that one masks such implementation details for  
you (and it's portable to non-*nix to boot).


Jonas



More information about the fpc-pascal mailing list