ich möchte mich etwas mit dem Thema C-Header bzw. Pascal Bindings beschäftigen. Zum Einstieg habe ich folgendes gefunden:
https://github.com/williamhunter/pascal ... (v1.0).pdf
Wie dort beschrieben habe ich zuerst die C-Datei "summe.c" in einem Texteditor erstellt (bin unter Linux Mint). In der ist die eigentliche Funktion "sum".
Code: Alles auswählen
/*
* Dateiname: summe.c
*
*/
#include "summe.h"
int sum(int x, int y)
{
return x+ y;
}Code: Alles auswählen
/*
* Dateiname: summe.h
*
*/
#ifndef SUMME_H
#define SUMME_H
// Funktionsprototyp(en)
int sum(int x, int y);
#endifWas genau macht hier:
#ifndef SUMME_H
#define SUMME_H
Aus den beiden Dateien habe ich mit dem Befehl
im Terminal die Objectdatei summe.o erzeugt.gcc -c summe.c
Dann habe ich per Hand ein Programm und eine Unit (Binding) erzeugt mit der ich die Funktion aufrufen kann.
Code: Alles auswählen
program project1;
{$mode objfpc}{$H+}
uses Unit1;
var a, b: integer;
begin
a := 12; // 17 im C-Programm
b := 51; // 19 im C-Programm
writeln('Aus Pascal: Die Summe von ', a, ' und ', b, ' ist ', sum(a, b));
end.Code: Alles auswählen
unit Unit1;
{$link summe.o} // Link zum C-Objekt-Code
interface
uses
ctypes; // muss angegeben werden, sonst wird FPC nicht kompiliert;
function sum(x, y : cint32) : cint32; cdecl; external;
// Funktions-Args und -Typen müssen mit denen in sum.h übereinstimmen
implementation
end.Ich habe die Datein summe.h und summe.o in ein leeres Verzeichnis kopiert. Dann habe ich mit Lazarus ein neues einfaches Programm erstellt in dem ich die Funktion sum aufrufe:
Code: Alles auswählen
program project1;
{$mode objfpc}{$H+}
uses summe;
var a, b: integer;
begin
a := 10;
b := 12;
writeln('Aus Pascal: Die Summe von ', a, ' und ', b, ' ist ', sum(a, b));
end.Hier sind die Einstellungen die ich gewählt habe:
Und so sieht das Ergebnis aus nach dem ich run h2pas geklickt habe:
Code: Alles auswählen
unit summe;
interface
uses
ctypes;
{
Automatically converted by H2Pas 1.0.0 from /home/bernd/Sprachen/Lazarus/64_bit/H2Pas/Test4/summe.tmp.h
The following command line parameters were used:
-e
-c
-S
-d
-C
-o
/home/bernd/Sprachen/Lazarus/64_bit/H2Pas/Test4/summe.pas
/home/bernd/Sprachen/Lazarus/64_bit/H2Pas/Test4/summe.tmp.h
}
{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}
{$ifndef SUMME_H}
function sum(x:cint; y:cint):cint;cdecl;external;
{$endif}
implementation
end. Gibt es eine Möglichkeit das der Link zur Objektdatei automatisch generiert wird?
Für Antworten, Erklärungen auch weitergehende bin ich sehr dankbar.
Viele Grüße
Bernd
PS: hänge noch die Dateien an.