Einzelnen Beitrag anzeigen

Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#908

Re: Andorra 2D [Ver. 0.4.5.1, 31.12.08]

  Alt 16. Jan 2009, 17:45
Eine weitere Übersetzung - inherited bestand drauf.

Zitat:
The FreeImage library in Linux

As there have been and still are problems using the FreeImage library with Andorra in Linux, I decided to write this small tutorial, which describes the basic process of compiling, installing and using this free graphics library and avoids possible sources of trouble.

-1. What is FreeImage?
FreeImage is an open source and free of charge graphics library with which many different graphics formats can be loaded and displayed. A complete list of the supported formats can be found at http://freeimage.sourceforge.net/features.html.

0. Determining whether FreeImage is in the packages
In some Linux distributions it is possible that the library is already in the package sources. This renders the manual compiling unnecessary and saves a lot of time.
However, I am quite sure that it does not exist neither in Debian and Ubuntu nor in SUSE Linux or Arch Linux as a precompiled package. Should it exist in your distribution nevertheless, you can skip the following steps until "Using FreeImage in Andorra"

1. Downloading FreeImage
Go to http://freeimage.sourceforge.net/download.html and download the source package (source distribution). A ZIP file named "FreeImage3100.zip" is created. The 3100 here is the version. At the moment of writing this document, 3.10.0 was the most recent version. Even if there is a more recent version available, the process described here should be applicable without further ado, only the commands containing the version number have to be adjusted.

2. Unpacking the archive
Unpack the archive either with a graphical decompressor or via command line using:
$ unzip FreeImage3100.zip and browse to the created directory "FreeImage".
$ cd FreeImage 3. Compiling FreeImage
Because FreeImage does not require any configuration, it should be possible to compile it directly. To do that, just call "make" in the command line in the directory "FreeImage":
$ make
Now it's time for a small coffee break while the library is being translated. Normally you should get an output similar to the following after a few minutes showing that compiling has been completed successfully:
Delphi-Quellcode:
cp *.a Dist
cp *.so Dist
cp Source/FreeImage.h Dist
make[1]: Leaving directory `/some/directory/FreeImage'
Should an error message be displayed instead, something went wrong. This can have several, often possibly highly diverse, reasons. In this case, try to get information about the problem from the internet or write directly to the Free Image developing team. You can also write an e-mail to me. You can find the address at the end of the tutorial.

4. Installing FreeImage
If everything went well until now, you can install the library by calling
$ make install in the FreeImage directory with root privileges. After that, a file named "libfreeimage.so" should have been created in /usr/lib.

5. Using FreeImage in Andorra
Now we get to the most exciting part of the tutorial: Including the library in Andorra. Thanks to modular interface system, this is very simple, a corresponding wrapper is also available already. All you have to do is to include the unit "AdFreeImage.pas" in your main unit. From now on, it is tried to load graphics files you load, with an image list, for instance, with the FreeImage library.


6. Troubleshooting

Unfortunately, errors occur, which is why I try to address the most common errors here.

"Wenn I try to load a graphics file with FreeImage, my programme crashes with the error 'SIGSEGV'."
This error is often an indication of a wrong call convention. Unfortunately, there are obviously differences between the FreeImage versions, and as a consequence of that, both the names of the supplied functions and the call conventions are partially different. Because I don't know the reasons for this yet, some compiler switches have been added to the wrapper to change the call convention as easily as possible. This switch is located in the unit "FreeImage.pas" in the subdirectory "lib" in the Andorra directory, it is called "FIcdecl" and is active in non-Windows systems by default. When it is activated with {$define Ficdecl}, the convention "cdecl" is used instead of "stdcall". Should the same error still occur, please do not hesitate and send me an e-mail.

"Wenn I try to compile the project, I get the error 'undefined reference to 'FreeImage_Initialise@4' or something like that."
This error also has to do something with the library's different versions mentioned above. Try to activate or deactivate the compiler switch "FINoPrefix" in the unit "FreeImage.pas". Should that not help, please send me an e-mail.

"When compiling, I get the error 'Fatal: Can't find unit AdPNGUtils used by AdFreeImage'"
This is apparently a bug of Lazarus or FreePascal that only occurred in my case. Should the same error happen in your case, try deleting the entry "AdPngUtils" in the "uses" clause of the "AdFreeImage" unit and adding it again and pay attention to the capitalisation. After that, it should compile.

7. If there are any more open questions...
do not hesitate and send me an e-mail to nwyderka at stud.informatik.uni-goettingen.de or take a look into the Delphi-PRAXiS at www.delphipraxis.net. We're happy to help you.

Und eine deutsche Version des englischen Tutorials über Andorra auf i386/amd64-Linux:
Zitat:
Der Sourceforge-Benutzer Nyrel hatte Probleme, als er Andorra 2D auf seinem Linux-System verwenden wollte. Er hat eine Anleitung geschrieben, um allen anderen Andorra 2D-Benutzern zu helfen, die versuchen, das selbe zu tun.

Andorra 2D 0.4.5.1 auf Linux i386 und amd64 zum Laufen bekommen
Ich habe diese Anleitung auf meinem ThinkPad-Notebook (i386, kubuntu 8.10, fpc 2.2.2, lazarus 0.9.26) und auf meinem PC (amd64, kubuntu 8.04 64bit, fpc 2.2.2, lazarus 0.9.27 SVN-Version etwa vom 1.1.2009) überprüft.

Voraussetzungen:
Eine funktionierende Installation von FPC und Lazarus.

Ich habe mich dazu entschieden, diese Anleitung Schritt für Schritt zu machen und alle dazwischenliegenden Fehlermeldungen zu zeigen, die man erhalten kann, bis alles richtig installiert ist. Dies kann vielleicht anderen helfen, diesen Thread zu finden, wenn sie nach ihren Fehlermeldungen suchen.

Es ist zu beachten, dass die gleichen Fehlermeldungen, die man erhält, aufgrund von Unterschieden in der Systemkonfiguration etwas anders sein können. Zögern Sie nicht, neue Fehlermeldungen und (hoffentlich) Lösungen zu diesem Thread hinzuzufügen.

Andorra 2D installieren
Laden Sie Andorra 2D herunter und entpacken Sie es in das Verzeichnis, in das sie es installieren wollen. Ich werde das folgende verwenden:
~/program/andorra


Erzeugen eines Testprojekts - Teil 1
Öffen Sie das SimpleNonVCL-Projekt in Lazarus. Dieses finden Sie hier:
~/program/andorra/demos/Simple/SimpleNonVCL/NoVCL.lpi

Drücken Sie F9 um zu versuchen, es zu kompilieren und auszuführen. Sie werden jedoch nicht weit kommen, weil es einige Dinge gibt, die sie ändern müssen:

Fehler 1:
Main.pas(50,31) Error: Identifier not found "ReportMemoryLeaksOnShutdown"
(Main.pas(50,31) Fehler: Bezeichner nicht gefunden: "ReportMemoryLeaksOnShutdown")

Lösung 1:
Einfach auskommentieren

Fehler 2:
/usr/bin/ld: cannot find -lfreeimage
/usr/bin/ld: -lfreeimage kann nicht gefunden werden

Lösung 2:
Die FreeImage-Bibliothek muss installiert werden. Starten Sie den Paketmanager für Ihre Linuxdistribution, (adept, synaptic, rpmdrake, etc.) suchen Sie nach FreeImage und installieren Sie es. Bei meinem System hieß das Paket "libfreeimage3".

Fehler 3 (noch einmal):
/usr/bin/ld: cannot find -lfreeimage
/usr/bin/ld: -lfreeimage kann nicht gefunden werden

Lösung 3:
Die FreeImage-Bibliothek kann nicht gefunden werden, weil die Bibliotheksdatei /usr/lib/libfreeimageplus.so.3 statt /usr/lib/libfreeimageplus.so heißt. Erzeugen sie eine symbolische Verknüpfung, um dies zu korrigieren:

sudo ln -s /usr/lib/libfreeimage.so.3 /usr/lib/libfreeimage.so

Mehr Informationen über das Problem mit FreeImage können in dem FreeImage-Tutorial-Tutorial nachgelesen werden. Sie müssen FreeImage nicht mit Andorra 2D verwenden. Die FreeImage-Bibliothek wird nur in dieser Demo dazu verwendet, PNG-Bilder zu laden. Sie können auch die Units "AdPNG" und "AdDevIL" statt "AdFreeImage" ausprobieren.

Fehler 4:
/usr/bin/ld: -lGL kann nicht gefunden werden

Lösung 4:
Wieder der falsche Name für die Bibliotheksdatei. Erzeugen Sie eine symbolische Verknüpfung:
sudo ln -s /usr/lib/libGL.so.1 /usr/lib/libGL.so


Ab hier kompiliert das Projekt erfolgreich auf meinem System. Aber es stürzt ab, wenn es ausgeführt wird.


Fehler 5:
Exception while creating process: Executable not found: "xterm"
(Exception beim Erzeugen des Prozesses: Ausführbare Datei "xterm" nicht gefunden)

Lösung 5:
Installieren Sie xterm mit ihrem Paketmanager. Normalerweise ist es bereits installiert, aber das war auf einer fast neuen kubuntu 8.10-Installation.

Fehler 6:
Exception: No compatible Andorra 2D plugin library found.
(Exception: Keine kompatible Andorra 2D-Pluginbibliothek gefunden)

Diese Exception tritt beim folgenden Befhler auf:
Main.pas, 65: AdDraw.DllName := DefaultPlugin
Dieser Fehler ist absolut in Ordnung zu diesem Zeitpunkt, da wir noch keine Plugins kompiliert haben. Lassen Sie uns zum nächsten Teil kommen.


Erzeugen der Andorra-Pluginbibliothek - Teil 1
Öffnen Sie das andorraOGL-Projekt:
~/program/andorra/src/dll/opengl/andorraOGL.lpi

Gehen Sie zu Projekt->Projektoptionen und ändern Sie den Namen des erzeugten Kompilats von:
../../../bin/AndorraOGLLaz.dll

nach:
../../../bin/libAndorraOGLLaz.so

Versuchen Sie, das Projekt mit Strg-F9 zu erzeugen.

An dieser Stelle sollte das Projekt erfolgreich kompilieren, wenn Sie einen i386 verwenden und Sie können mit "Erzeugen eines Testprojekts - Teil 2" fortfahren.

Wenn Sie ein 64 Bit-System verwenden, gibt es noch ein paar Probleme zu lösen.


Fehler 7:
/usr/bin/ld: ~/program/andorra/src/dcu/AdClasses.o: relocation R_X86_64_32S against _$ADCLASSES$_Ld1' can not be used when making a share object; recompile with -fPIC
(/usr/bin/ld: ~/program/andorra/src/dcu/AdClasses.o: Relokation R_X86_64_32S gegen _$ADCLASSES$_Ld1' kann nicht verwendet werden, wenn ein gemeinsam genutztes Objekt erzeugt wird; Kompilieren Sie noch einmal mit -fPIC.)

Lösung 7:
Ich weiß nicht genau, worum es da geht, aber lassen Sie uns einfach dem Rat folgen und mit "-fPIC" neu kompilieren. Gehen Sie zu Projekt->Compilereinstellungen->Andere und schreiben Sie -fPic in das Feld für benutzerdefinierte Optionen.

Jetzt sollte das Projekt richtig kompilieren, aber es müssen immer noch einige Probleme gelöst werden, bevor es wirklich funktioniert. Wir kommen gleich dazu!


Erzeugen eines Testprojekts - Teil 2
Also Sie das AndorraOGL-Projekt oben erzeugt haben, hat es eine Pluginbibliotheksdatei in Andorras bin-Verzeichnis (~/program/andorra/bin) erstellt. Wir brauchen diese Datei, um das Testprojekt zum Laufen zu bekommen, also kopieren Sie die Bibliotheksdatei in Ihr Projektverzeichnis:

cp ~/program/andorra/bin/libAndorraOGLLaz.so ~/program/andorra/demos/Simple/SimpleNonVCL/

Öffnen Sie erneut das das SimpleNonVCL-Projekt in Lazarus und drücken Sie F9 um zu versuchen, es auszuführen.

Wenn Sie einen i386 verwenden, sollte dieses mal alles funktionieren und sie sollten ein schwarzes Fenster mit einem Andorra-Logo und einem Text, der den Mauszeiger verfolgt, sehen.

Wenn Sie immer noch eine Exception bei der Zuweisung von DllName erhalten, können Sie versuchen, diese Zeile von:
AdDraw.DllName := DefaultPlugin nach:
AdDraw.DllName := './libAndorraOGLLaz.so' zu ändern. Wenn Sie jedoch einen amd64 verwenden, werden Sie eine Exception bei der Initialisierung von OpenGL erhalten.

Fehler 8:
Main.pas: AdDraw.Initialize ->
AdDraws.pas, 1453: AdAppl.Initialize(FWnd) ->
OGLMain.pas, 249: InitOpenGL ->
dglOpenGL, 8848: glXGetProcAddress := glProcedure('glXGetProcAddress');
dglOpenGL, 8809: Result := GetProcAddress(LibHandle, ProcName);
dglOpenGL, 8702: Result := dlsym(Pointer(LibHandle), ProcName);


Der Fehler tritt in der Funktion LoadLibrary auf, in der der Rückgabewert von dlopen auf ein THandle gecastet wird. Das Problem ist, dass THandle als 32 Bit groß definiert ist, aber der Rückgabewert 64 Bit groß ist.

Delphi-Quellcode:
function LoadLibrary(Name: PChar): THandle;
begin
  Result := THandle(dlopen(Name, RTLD_LAZY));
end;
Also müssen wir das in der Pluginbibliothek ändern.

Erzeugen der Andorra-Pluginbibliothek - Teil 2
Öffnen Sie das andorraOGL-Projekt noch einmal.

Lösung 8:
Die Lösung ist, eine neue Typendefinition von THandle überall hinzuzufügen, wo es auftaucht:

~/program/andorra/src/dll/opengl/OGLShader.pas:
118: function TOGLShaderSystem.LoadShaderPlugin(AID: TAdVeryShortString): boolean;
119: type // Added
120: THandle = Int64; // Neu


~/program/andorra/lib/dglOpenGL.pas:
225: type
226: THandle = Int64; // Neu


Dieser Fehler sollte bei neuen Versionen von Andorra 2D (neuer als 0.4.5.1) behoben sein.

Nun sollten Sie in der Lage sein, das Projekt erfolgreich zu kompilieren und eine gültige 64 Bit-Pluginbibliothek zu kompilieren. Mit der neuen Version von libAndorraOGLLaz.so sollte es auch möglich sein, das Testprojekt erfolgreich zu kompilieren und auszuführen!

Ich habe mich durch die Tutorials auf der Andorra-Webseite gearbeitet und bist jetzt habe ich das Sprite-Engine-Tutorial ohne (größere) Probleme abgeschlossen.

Hinweis: THandle wird auch in einigen anderen Dateien verwendet. (suchen Sie einfach danach) Es ist wahrscheinlich eine gute Idee, seine Neudefnition auch zu ihnen hinzuzufügen, aber die Änderungen oben sind genug, um alles erstmalig zum Laufen zu bekommen.

Im Übrigen fehlt bei beiden Originaltutorials der Hinweis auf den Autor und die Lizenz ganz unten, und daher auch hier in den Übersetzungen. Im englischen Original des zweiten Tutorials kann der Hinweis darauf, dass es das FreeImage-Tutorial nur auf Deutsch gibt, nun entfernt werden.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat