Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C++-Library in Delphi-Programm nutzen

40 views
Skip to first unread message

Jens Lenge

unread,
Jan 8, 2008, 11:14:46 AM1/8/08
to
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. ä..

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

Daniel Albuschat

unread,
Jan 8, 2008, 11:26:26 AM1/8/08
to
Jens Lenge schrieb:

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

Jens Lenge

unread,
Jan 8, 2008, 11:47:39 AM1/8/08
to
Daniel Albuschat wrote:
> 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.

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

Arno Garrels

unread,
Jan 8, 2008, 12:28:30 PM1/8/08
to
Jens Lenge wrote:
> Will sagen, erlaubt es Delphi 2007 überhaupt irgendwie[tm], statische
> C-Libs einzubinden? Ich finde überall nur was zu DLLs...

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


Jens Lenge

unread,
Jan 8, 2008, 12:44:55 PM1/8/08
to
Arno Garrels wrote:
> Objektdatei linken

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?

Rudy Velthuis

unread,
Jan 8, 2008, 12:54:00 PM1/8/08
to
Jens Lenge wrote:

> 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

Rudy Velthuis

unread,
Jan 8, 2008, 12:57:10 PM1/8/08
to
Jens Lenge wrote:

> 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)

Rudy Velthuis

unread,
Jan 8, 2008, 12:57:53 PM1/8/08
to
Jens Lenge wrote:

> 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-)

Jens Lenge

unread,
Jan 8, 2008, 1:17:49 PM1/8/08
to
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.

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

Rudy Velthuis

unread,
Jan 8, 2008, 5:51:55 PM1/8/08
to
Jens Lenge wrote:

> 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)

Arno Garrels

unread,
Jan 9, 2008, 3:04:10 PM1/9/08
to

"Rudy Velthuis" <newsg...@rvelthuis.de> schrieb im Newsbeitrag news:xn0fkya0o...@news.online.de...

> Siehe hier: http://rvelthuis.de/articles/articles-cobjs.html

Den hab ich gleich mal in meine Linksammlung gepackt, guter
Artikel!

--
Arno Garrels


Rudy Velthuis

unread,
Jan 9, 2008, 3:32:46 PM1/9/08
to
Arno Garrels wrote:

Da gibt es noch einige:

http://rvelthuis.de/articles

;-)

--
Rudy Velthuis http://rvelthuis.de

"Not everything that can be counted counts, and not everything
that counts can be counted." -- Albert Einstein (1879-1955)

Markus Springweiler

unread,
Jan 10, 2008, 7:20:44 AM1/10/08
to
Jens,

> 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.

Jens Lenge

unread,
Jan 10, 2008, 8:23:56 AM1/10/08
to
Markus Springweiler wrote:
> 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

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

0 new messages