ich möchte in einem Delphi-2007-Programm Funktionen aus einer statischen
C/C++-Bibliothek (.lib) aufrufen. Die Lib exportiert nur "normale"
Funktionen, keine Objekte o. ä..
Nun muss ich Delphi irgendwie[tm] beibringen,
a) die .lib zum Programm dazuzulinken, und
b) die Funktionen passend zu deklarieren, um sie aufrufen zu können.
Geht sowas?
Zu a) finde ich in den Linker-Einstellungen von Delphi nichts, und bei
b) weiß ich primät nicht, wie ich einen C++-Namespace abbilde. Z. B. in C++:
namespace ABC
{
extern void myfunction(int& p1, int& p2);
}
Wie sieht die entsprechende Deklaration in Delphi aus?
Müsste ja sowas sein wie...
procedure myfunction(var p1: integer; var p2: integer);
...aber wie bringe ich den ABC-Namespace unter und sage, dass die
Funktion aus einer Lib kommt?
Wer kann mich auf die richtige Spur bringen?
Jens
Das, was du vorhast, ist relativ unmöglich. Das grösste Problem ist hier
das "Name-Mangling". In C++ können Funktionen wie in Delphi überladen
werden, weshalb es nötigt wurde, die exportierten Symbole zu kodieren.
So wird aus int foo(); nicht mehr das Symbol "foo", sondern ein _Z3foov.
Bei Namespaces wird es dann noch komplizierter.
Ich arbeite gerade an einer Lösung an dieser und weitaus komplizierterer
Problematiken, um C++ in andere Sprachen über C-kompatible Interfaces
anzusprechen.
Genaueres darüber kannst du hier lesen:
http://daniel-albuschat.blogspot.com/2007/12/c-glue.html
MfG,
Daniel
Das name mangeling lässt sich ja meist per 'extern "C"' abschalten
(natürlich muss man dann auf Überladungen verzichten).
Sagen wir mal, ich beschränke das Interface auf C-Konvention und lasse
auch die Namespaces weg - geht es denn *überhaupt*?
Will sagen, erlaubt es Delphi 2007 überhaupt irgendwie[tm], statische
C-Libs einzubinden? Ich finde überall nur was zu DLLs...
Jens
Objektdatei linken
Typ Parameter
Syntax {$L Dateiname}
{$LINK Dateiname}
Bereich Lokal
Anmerkungen
Die Direktive $L weist den Compiler an, die angegebene Datei mit dem compilierten Programm bzw. der compilierten Unit zu linken. Wenn Sie Prozeduren und Funktionen verwenden, die als external deklariert sind, können Sie mit dieser Direktive Code linken, der in anderen Sprachen geschrieben ist. Die angegebene Datei muss eine nach Intel-Norm verschiebbare Objektdatei (.OBJ file) sein. Die vorgegebene Namenserweiterung für die Datei ist .OBJ. Wenn die Datei ohne Verzeichnispfad angegeben wird, sucht Delphi die Datei in dem Verzeichnis, in dem auch das Modul liegt. Außerdem werden alle Verzeichnisse durchsucht, die im Eingabefeld Suchpfad der Registerkarte Verzeichnisse/Bedingungen im Dialogfeld Projekt/Optionen (oder mit der Option -I in der DCC32-Kommandozeile) festgelegt wurden.
Wenn der Dateiname ein Leerzeichen enthält, schließen Sie ihn in halbe Anführungszeichen ein: {$L 'Meine Datei'}.
Weitere Einzlheiten über das Linken mit Assembler finden Sie in der Online-Hilfe.
--
Ein Beispiel mit zlib findest du z.B. in ICS (http://www.overbyte.be)
--
Arno Garrels
Objektdateien enthalten benötigte Biliotheksfunktionen noch nicht. Das
macht es in meinem Fall unbrauchbar, nur die Objektdatei zu nehmen; ich
brauche die komplette lib.
Es muss doch irgendwie möglich sein, eine statische C-Lib zu einem
Delphi-Exe zu linken. Oder doch nicht?
> Hallo Welt,
>
> ich möchte in einem Delphi-2007-Programm Funktionen aus einer
> statischen C/C++-Bibliothek (.lib) aufrufen. Die Lib exportiert nur
> "normale" Funktionen, keine Objekte o. ä.
Da gibt es verschiedene Möglichkeiten
- 1. Du extrahierst die .obj-Dateien der .lib und linkst die zu deinem
Delphi-Programm. Die .obj-Dateien müssen allerdings C sein und
OMF-Format (kein COFF, wie z.B. Microsoft generiert).
- oder 2. Du kompilierst die .lib-Datei zu einer DLL und exportierst
die Funktionen die du brauchst.
- oder 3. Du hast den Quelltext und kannst Punkt 1 ausführen.
--
Rudy Velthuis http://rvelthuis.de
"The problem with people who have no vices is that
generally you can be pretty sure they're going to
have some pretty annoying virtues."
-- Elizabeth Taylor
> Das name mangeling lässt sich ja meist per 'extern "C"' abschalten
> (natürlich muss man dann auf Überladungen verzichten).
>
> Sagen wir mal, ich beschränke das Interface auf C-Konvention und
> lasse auch die Namespaces weg - geht es denn überhaupt?
Na klar. http://rvelthuis.de/articles/articles-cobjs.html
Du solltest dann keine .lib generieren, sondern die .obj-Dateien
benutzen. Notfalls msvcrt.pas benutzen für die Standard-Funktionen.
--
Rudy Velthuis http://rvelthuis.de
"First they ignore you, then they laugh at you, then they fight
you, then you win." -- Mahatma Gandhi (1869-1948)
> Arno Garrels wrote:
> > Objektdatei linken
>
> Objektdateien enthalten benötigte Biliotheksfunktionen noch nicht.
Kein Problem.
Siehe hier: http://rvelthuis.de/articles/articles-cobjs.html
--
Rudy Velthuis http://rvelthuis.de
"University politics are vicious precisely because the stakes
are so small." -- Henry Kissinger (1923-)
Delphi *kann* schlicht und ergreifend keine statischen Libs hinzulinken.
Wenn man sowas möchte, muss man wie angeraten auf Objektfiles oder auf
DLLs ausweichen, ".lib" direkt geht aber - egal wie man es anstellt - nicht.
Sehe ich das richtig?
Jens
> Da sich die gegebenen Hilfen durchweg auf Objektfiles oder auf DLLs
> beziehen, schließe ich mal daraus:
>
> Delphi kann schlicht und ergreifend keine statischen Libs hinzulinken.
Wie ich schon sagte. Aber wenn man den Quelltext hat, ist es einfach
die .obj-Dateien hinzulinken.
--
Rudy Velthuis http://rvelthuis.de
"There's many a bestseller that could have been prevented by a
good teacher." -- Flannery O'Connor (1925-1964)
> Siehe hier: http://rvelthuis.de/articles/articles-cobjs.html
Den hab ich gleich mal in meine Linksammlung gepackt, guter
Artikel!
--
Arno Garrels
Da gibt es noch einige:
;-)
--
Rudy Velthuis http://rvelthuis.de
"Not everything that can be counted counts, and not everything
that counts can be counted." -- Albert Einstein (1879-1955)
> Delphi *kann* schlicht und ergreifend keine statischen Libs hinzulinken.
Ehrlich gesagt hatte ich nie mit statischen Libs zu tun -- selbst die mit
BP7 (DOS!) eingeführten DLLs waren dynamisch (wenn ich mich jetzt nicht
total falsch erinnere).
Aber u.U. könnte ein Umweg über FPC helfen? (Möglicherweise aber auch nur
unter Linux.)
http://freepascal.org/docs-html/prog/progsu122.html#x166-1650007.1.4
--
/\/\arkus.
Danke für den Hinweis, werd ich mir mal ansehen.
Ein Ausweichen auf eine DLL oder ein Objektfile ist in meinem Fall
leider keine Option, es muss zwingend eine statische ".lib" eingebunden
werden (auf die ich auch keinen Einfluss habe).
Jens