Seite 1 von 1

Wie eigene LIB-Datei ersetzen bzw. erstellen

Verfasst: Mi, 22. Aug 2012 10:44
von Torsten.E
Hallo,

ich habe eine Clipper-Library aus ca. 90 PRG-Files. Diese LIB-Datei kann ich
ja nicht mehr in xBase einbinden.

Jetzt möchte ich hierfür eine neue LIB-Datei DLL-Datei, was auch immer
erstellen. Der Source-Code der 90 PRG-Files ist vorhanden.

Wie erstelle ich eine neue LIB-Datei ?

Torsten.E

Re: Wie eigene LIB-Datei ersetzen bzw. erstellen

Verfasst: Mi, 22. Aug 2012 10:48
von Jan
Hallo Torsten,

schau Dir dazu mal die Compiler-Schalter an. Du kannst darüber steuern, eine statische oder dynamicsche DLL anzulegen. Du kannst auch in einer gemeinsamen Projektdatei die exe und dazugehörige DLL verwalten.

Jan

Re: Wie eigene LIB-Datei ersetzen bzw. erstellen

Verfasst: Mi, 22. Aug 2012 11:03
von Torsten.E
Hey Jan,

danke für die schnelle Antwort.
Habe mir die Schalter schnell angesehen, werde aber daraus nicht ganz schlau.

In einem Verzeichnis liegen ca. 90 Dateien: BS01.PRG, BS02.PRG ... BS90.PRG
Diese Dateien waren früher in diesem Verzeichnis zu BS.LIB erstellt.

(syntatisch ähnlicher Batch-Code zum Erstellen der BS.LIB)

Code: Alles auswählen

...
CLIPPER bs01 /M/N/W
LIB bs +bs01;;
...

Jetzt habe ich ein PROJECT.XPJ

Dort möchte ich natürlich jetzt nicht die 90 Dateien alle auflisten, ist ja auch Blödsinn,
dort sollte praktisch nur die BS.DLL mit eingebunden werden.

D.h. wir erstelle ich die BS.DLL (in dem extra Verzeichnis nur mit den 90 Dateien) und wie binde ich diese in der PROJECT.XPJ ein ?

Re: Wie eigene LIB-Datei ersetzen bzw. erstellen

Verfasst: Mi, 22. Aug 2012 11:29
von georg
Hallo, Torsten -


das sollte dann so aussehen:

Code: Alles auswählen

[PROJECT.XPJ]
meinpgm.exe
meinedll.dll

[meinpgm.exe]
meinpgm.prg
meindies.prg
meindas.prg

[meinedll.dll]
bs01.prg
bs02.prg
...
bs90.prg
Du kommst nicht umhin, alle PRGs aufzulisten.

Nachdem Du die project.xpj fertig hast, einmal pbuild /g aufrufen, und dann pbuild.

Dann gibt es da noch so eine Besonderheit, dass alle externen Referenzen (Function Calls etc.) entweder in der DLL selbst definiert sein müssen, bzw. in den Runtime Libraries von Xbase vorkommen müssen.

Wenn meinedll.dll also eine Funktion aus meindies.prg aufruft, geht das erst mal nicht, weil der Linker die Referenz innerhalb der DLL nicht auflösen kann. Man kann diesen Konflikt jedoch lösen, indem man die Funktion über einen Codeblock zur Laufzeit anspricht:

Code: Alles auswählen

bBlock := "{|p1, p2, p3| MeineFunktion(p1, p2, p3)}"
bBlock := &bBlock
nErgebnis := Eval(bBlock, param1, param2, param3)

Alternativ kannst Du natürlich auch ein separates Verzeichnis für die DLL anlegen, dort eine eigene project.xpj anlegen. Mit "dir /b *.prg > ausgabe.txt" bekommst Du auch recht schnell eine editierfähige Liste der zur DLL gehörenden Dateien.

In Deinem Programm gibst Du dann über die Anweisung

Code: Alles auswählen

#PRAGMA Library("MeineDLL.DLL")
dem Linker die Anweisung, die DLL einzubinden.


Gruss,

Georg

Re: Wie eigene LIB-Datei ersetzen bzw. erstellen

Verfasst: Mi, 22. Aug 2012 20:42
von brandelh
Xbase++ DLLs und statische LIBs müssen aber immer mit der gleichen Version erstellt worden sein (runtime dlls etc.),
ich binde direkt die PRGs (also source code bibliothek) ein. Dabei muss man aktuell die PRGs alle im Programmverzeichnis vorhalten.
Das mache ich mit einer Batch die aus einem Entwicklungsverzeichnis die PRG herüberkopiert.

Re: Wie eigene LIB-Datei ersetzen bzw. erstellen

Verfasst: Mi, 22. Aug 2012 23:13
von AUGE_OHR
Torsten.E hat geschrieben:Jetzt möchte ich hierfür eine neue LIB-Datei DLL-Datei, was auch immer
erstellen. Der Source-Code der 90 PRG-Files ist vorhanden.

Wie erstelle ich eine neue LIB-Datei ?
1.) alle LIB PRG in einen Ordner kopieren
2.) DIR *.PRG /B > PROJECT.TXT
3.) PBUILD @PROJECT.TXT
4.) PBUILD PROJECT.XPJ -g
5.) jetzt die PROJECT.XPJ editieren und folgendes eintragen.

Code: Alles auswählen

// wird dann automatisch angelegt
OBJ_DIR       = .\OBJ

[PROJECT.XPJ]
    deine.DLL

[deine.DLL]
// für die DLL
    COMPILE_FLAGS = /dll /n /q /w /o\OBJ\ 
// $START-AUTODEPEND
    bs01..OBJ
    ...
    bs90.obj 
// $STOP-AUTODEPEND
    bs01.prg
    ...
    bs90.prg
damit "sollte" er dir dann deine.LIB, deine.DLL und deine.DEF erzeugen.
da du Cl*pper Code verwendest musst du überlegen ob in deiner LIB noch "Text Eingaben / Ausgaben" sind den dann muss GUI = NO in das Project.XPJ

Tip : "Pbuild Project.XPJ > Logfile.TXT"