Tutorials

FreeImage Library unter Linux

Da es immer wieder Probleme gab und gibt, die FreeImage-Bibliothek mit Andorra unter Linux zu nutzen, habe ich mich entschlossen dieses kleine Tutorial zu schreiben, das den groben Ablauf der Kompilation, Installation und Verwendung der freien Grafikbibliothek beschreibt und mögliche Fehlerquellen umschifft.

-1. Was ist FreeImage?
FreeImage ist eine quelloffene und kostenfreie Grafikbibliothek, mit der es möglich ist, viele verschiedene Grafikformate zu laden und anzuzeigen. Eine vollständige Liste der unterstützden Formate finden Sie unter http://freeimage.sourceforge.net/features.html

0. Herausfinden ob sich FreeImage in den Paketen befindet.
Unter einigen Linux-Distributionen kann es sein, dass sich die Bibliothek bereits in den Paketquellen befindet. Das erspart das manuelle Kompilieren und spart erheblich Zeit.
Ich bin mir jedoch ziemlich sicher, dass sie weder unter Debian und Ubuntu, noch bei SUSE Linux oder Archlinux als vorkompiliertes Paket vorhanden ist. Sollte sie jedoch bei Ihnen verfügbar sein, können Sie die folgenden Schritte überspringen und direkt zu "Nutzen von FreeImage in Andorra" springen.

1. Herunterladen von FreeImage
Gehen Sie auf http://freeimage.sourceforge.net/download.html und laden sie das Quellpaket (Source distribution) herunter. Eine Zip-Datei namens "FreeImage3100.zip" wird erstellt. Das 3100 steht hier für die Version. Zum Zeitpunkt des Verfassens dieses Dokuments war 3.10.0 die aktuelle Version. Auch wenn eine neuere Version verfügbar sein sollte, sollte der hier beschriebene Weg ohne weiteres übertragbar sein, lediglich die Kommandos, in denen die Versionsnummer vorkommt, müssen dann angepasst werden.

2. Entpacken des Archivs
Entpacken Sie das Archiv entweder mit einem grafischen Entpacker, oder über die Kommandozeile per

Delphi-Code:
$ unzip FreeImage3100.zip

und wechseln Sie in das erstellte Verzeichnis "FreeImage".

Delphi-Code:
$ cd FreeImage

3. Kompilieren von FreeImage
Da FreeImage keine Konfiguration braucht, sollte es möglich sein, es direkt zu kompilieren.
Dazu rufen Sie in der Kommandozeile in dem Ordner FreeImage einfach "make" auf:
$ make
Jetzt ist Zeit für eine kleine Kaffeepause, während die Bibliothek übersetzt wird.
Im Normalfall sollte nach einigen Minuten eine Ausgabe die folgender ähnlich ist erscheinen, die anzeigt, dass der Übersetzungsvorgang erfolgreich abgeschlossen wurde:

Delphi-Code:
cp *.a Dist
cp *.so Dist
cp Source/FreeImage.h Dist
make[1]: Leaving directory `/irgendein/verzeichnis/FreeImage'

Sollte stattdessen eine Fehlermeldung zu sehen sein, ist etwas schief gelaufen. Das kann mehrere Gründe haben, die oft vielfältig sein können. Versuchen Sie in diesem Fall über das Internet Informationen über das Problem zu erhalten oder wenden Sie sich direkt an das Entwicklerteam von FreeImage. Sie können mir auch eine E-Mail schreiben. Die Adresse finden Sie am Ende des Tutorials.

4. Installation von FreeImage
Ist bis hierhin alles glatt gegangen, können Sie die Bibliothek jetzt installieren, indem Sie mit Rootrechten im FreeImage-Verzeichnis

Delphi-Code:
$ make install

aufrufen. Danach sollte eine Datei namens "libfreeimage.so" in /usr/lib vorhanden sein.

5. Nutzen von FreeImage in Andorra
Kommen wir zum eigentlich spannendsten Teil des Tutorials: Das Einbinden der Bibliothek in Andorra. Dank des modularen Schnittstellensystems ist das ganz einfach, auch ein entsprechender Wrapper steht schon bereit. Alles was Sie tun müssen, ist die Unit "AdFreeImage.pas" in ihre Hauptunit einzubinden. Von nun an wird versucht, Grafikdateien die Sie einlesen, zum Beispiel mit Hilfe einer Imagelist, mit der FreeImage-Bibliothek zu laden.

6. Troubleshooting

Leider bleiben Fehler nicht aus, weshalb ich versuche, hier auf die am häufigsten auftretenden Fehler einzugehen.

"Wenn ich versuche eine Grafikdatei mit FreeImage zu laden, stürzt mein Programm mit dem Fehler 'SIGSEGV' ab."
Dieser Fehler ist häufig ein Hinweis auf eine falsche Aufrufkonvention. Leider musste ich feststellen, dass es offenbar Unterschiede zwischen den FreeImage-Versionen gibt, was zur Folge hat, dass einmal die Namen der bereitgestellten Funktionen abweichen können, als auch die Aufrufkonventionen zum Teil anders sind. Da mir die Gründe hierfür noch nicht bekannt sind, wurden in den Wrapper einige Kompilerschalter eingebaut, um möglichst einfach die Aufrufkonventionen ändern zu können. Dieser Schalter befindet sich in der Unit "FreeImage.pas" in dem Unterverzeichnis "lib" im Andorra-Verzeichnis, heißt "FIcdecl" und ist unter nicht-Windows Systemen standardmäßig aktiviert. Ist er per {$define Ficdecl} eingeschaltet, wird statt der Konvention "stdcall" die Konvention "cdecl" verwendet. Sollte der gleiche Fehler weiterhin auftauchen, so zögern Sie bitte nicht und schicken mir eine E-Mail.

"Wenn ich versuche, dass Projekt zu kompilieren, erhalte ich den Fehler 'undefined reference to `_FreeImage_Initialise@4' ' oder ähnlich."
Auch dieser Fehler hat etwas mit den oben angesprochenen unterschiedlichen Versionen der Bibliothek zu tun. Versuchen Sie in der Unit "FreeImage.pas" den Kompilerschalter "FINoPrefix" zu setzen oder aufzuheben. Sollte das nicht helfen, senden Sie mir bitte eine E-Mail.

"Beim Kompilieren erhalte ich den Fehler 'Fatal: Can't find unit AdPNGUtils used by AdFreeImage' "
Das ist offenbar ein Bug von Lazarus oder FreePascal, der bisher nur bei mir aufgetreten ist. Sollte der gleiche Fehler bei Ihnen auftreten, versuchen Sie in der Unit "AdFreeImage" im Abschnitt "uses" den Eintrag "AdPngUtils" zu löschen und wieder hineinzuschreiben. Achten Sie hierbei auf Groß- und Kleinschreibung. Danach sollte es kompilieren.

7. Wenn noch Fragen offen sind...
...zögern Sie nicht und schreiben Sie eine E-Mail an mich an nwyderka at stud.informatik.uni-goettingen.de oder schauen Sie in der Delphipraxis unter www.delphipraxis.net vorbei. Wir helfen gerne weiter.


This page was generated with the help of the following PHP-Scripts: GeSHi a free PHP Syntax highlighter and StringParser_BBCode a free BBCode Parser.