On 2017-08-16 18:14, Sven Barth via fpc-pascal wrote:
As you can see the program will work correctly as long as the
libX11.so.6 file exists (even though that is a symlink itself, but the
X11 project guarantees that different libX11.so.6.x.y are compatible to
eachother), because the linker picks the SONAME that is set inside the
binary. And the libX11.so.6 symlink is part of the non-devel package.

Sven, now here is an interesting problem regarding the way FPC (or Object Pascal in general) works with C based libraries. Martin pointed this out in another mailing list, and he gave me permission to forward it here. What is your answer or recommendation to this problem?



-------- Forwarded Message --------
Subject: Re: [MSEide-MSEgui-talk] MSE and XLib.
Date: Thu, 17 Aug 2017 14:54:16 +0200
From: Martin Schreiber
To: mseide-msegui-t...@lists.sourceforge.net

On Thursday 17 August 2017 10:54:31 Graeme Geldenhuys wrote:
> On 2017-08-17 07:18, Martin Schreiber wrote:
> > I don't understand why FPC uses the version-less library
> > names instead of the mayor version names where the bindings are made for.
> > Maybe a misunderstanding happened at ancient times...
>
> No, they are simply following the guidelines of Unix-type systems -
> doing everything correctly by the book.

A hypothetical example:

- You make a pascal bindings file for the "greatlibrary" version 1.0.
- You set the library name in the bindings pascal file "great.pas" to "great" as Unix-type systems guidelines command. - In your system great-devel package of the version 1.0.1 is installed, you have the c-header *.h files of libgreat 1.0.1 and the links libgreat.so -> libgreat.so.1 -> libgreat.so.1.0.1.
- The SONAME of libgreat.so.1.0.1 is libgreat.so.1
- You compile and run the application, libgreat.so.1 -> libgreat.so.1.0.1 is loaded, all is OK.

Now you give the source of the application to a colleague who has installed the newer but incompatible "greatlibrary" version 2.0.3 including the devel package. - He has the c-header *.h files of libgreat 2.0.3 and links libgreat.so -> libgreat.so.2 -> libgreat.so.2.0.3.
- The SONAME of libgreat.so.2.0.3 is libgreat.so.2
- He compiles your program, the linker links libgreat.so -> libgreat.so.2 -> libgreat.so.2.0.3 and stores the SONAME libgreat.so.2 (remember, libgreat.so.2 and libgreat.so.1 are *not* compatible).

Now there are two possibilities, maybe the function names in libgreat.pas did not change between version 1 and 2 -> the program compiles but crashes because of changed parameters or other incompatibilities. Or it does not compile and then he needs to install version 1 of "greatlibrary" and deinstall great-devel-2.0.3 and install great-devel-1.0.1 or change manually libgreat.so -> libgreat.so.2 to libgreat.so -> libgreat.so.1 temporarily. This also must be done in first case in order to produce a working application.

The difference between a FPC bindings unit and a Unix C-header *.h file is that the *.h file is *included* in the devel-package and thus matches the installed version, the pascal file is not included but in a separate package or more likely taken from the FPC tar archive by the FPC install script because FPC Linux/FreeBSD-packages usually are too old or one wants to use a FPC version from SVN. So the "guidelines for Unix-type systems" are not appropriate for Free Pascal C-library binding units IMHO.

Martin
---------------------------------------------------



Regards,
  Graeme

--
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://fpgui.sourceforge.net/

My public PGP key:  http://tinyurl.com/graeme-pgp
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to