Tout d'abord, je travail en ligne de commande, le dossier "compiler" de PB et dans le PATH ( windows ou linux , peu importe ), si vous ne savez pas ce qu'est le PATH -> google.
pour tester si cela fonctionne lancé un terminal : win+r , cmd , pbcompiler
en tapant le nom du pré-compilateur pb , vous devriez avoir un truc du genre :
C'est que cela marche.PureBasic 5.60 (Windows - x86) - (c) 2016 Fantaisie Software
...
...
pré-compilateur ? oui, PB ne compile rien , il transforme le code en ASM, c'est FASM le compilateur, ou la partie arrière de PB... bref... il faut avoir en tête cela. je ne rabaisse pas le travail du code PB vers ASM, c'est complexe à réaliser et très certainement au dessus de vos compétences, mais là n'est pas le sujet.
Donc , pour créer une userlib, il faut des fonctions PB que l'on va exporté comme une DLL : ProcedureDLL
Exemple :
Code : Tout sélectionner
ProcedureDLL.l Add(A.l,B.l)
procedureReturn A+B
EndProcedure
une fois dans votre dossier ( dans le terminal ) , faite :
si il n'y a pas d'erreur , un fichier ASM ( PureBasic.asm ) à été généré.pbcompiler VotreFichier.pb /COMMENTED
on va devoir faire 2/3 modif a l'intérieur , rien de bien compliqué, mais il y a deux trois astuce a comprendre.
tout d'abord, les dépendances de votre code, PB le fait de manière automatique, mais comme on casse un peu le "procédé" normal, il va falloir être vigilant.
pour cela, le fichier ASM contient absolument toute les infos que l'on a besoin ( on remercie au passage Fred , qui a commenté les dépendances dans le fichier ASM )
par exemple :
Code : Tout sélectionner
;
; PureBasic 5.60 (Windows - x86) generated code
;
; (c) 2016 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; Requester
; FileSystem
; Date
; Object
; SimpleList
; :System
; kernel32.lib
; :Import
;
format MS COFF
...
...
...
...
Une fois cela noté ( correctement et case sensitive... )
il faut partir à la recherche des fonctions ASM que vous avez codé en PB, là encore, Fred à pensé à mettre en commentaire le nom réel de la fonction.
toute les fonctions sont renomé ainsi : _Procedure0: _Procedure1: etc...
Exemple :
Il faut donc modifier le _Procedure0 par le nom de votre fonction et rajouté le suffixe PB_ devant :;
; ProcedureDLL.l Add(A,B)
_Procedure0:
PUSH ebx
PS2=12
XOR eax,eax
Mais cela ne suffit pas, il faut rendre "visible" cette fonction de l'extérieur , pour cela , une simple ligne de code suffit : "public PB_Add";
; ProcedureDLL.l Add(A,B)
PB_Add:
PUSH ebx
PS2=12
XOR eax,eax
Une fois que vous avez fait vos modification, il faut compilé le code ASM fraichement modifié, pour cela , rien de plus simple , toujours avec le terminal :;
; ProcedureDLL.l Add(A,B)
public PB_Add
PB_Add:
PUSH ebx
PS2=12
XOR eax,eax
si il n'y a pas d'erreur , le fichier MonUserLib.obj à été généré , c'est une lib statique ( utilisable aussi en C d'ailleurs avec un header qui va bien... )fasm PureBasic.asm MonUserLib.obj
il est temps de passé à la dernière phase, la création d'un fichier de description des fonctions, pour cela vous allez créer un fichier .desc dans le même répertoire que votre code PB , code ASM et librairie .obj , ex : MonUserLib.desc
PB est livré avec un SDK , il y a un fichier Readme.txt qui explique la totalité de la création de ce fichier, là on va se contenté de la fonction Add() que l'on veut rajouté en userlib.
Voici le fichier .desc pour la fonction Add, on peut rajouté autant de fonctions que l'on veut dans le .desc ( attention fichier a case sensitive aussi !! )
Si j'avais rajouté un messagerequester , j'aurais eu des dépendences, là il y en à 0 , on le constate car il y a écrit 0 en dessous de OBJ ( le type de lib )ASM
0
OBJ
0
UserLib
Add, Long, Long, (A,B) - Une fonction qui ne sert strictement à rien !
Long | StdCall
exemple avec des dépendances :
Les noms proviennent du fichier ASM.ASM
0
OBJ
5
Requester
FileSystem
Date
Object
SimpleList
UserLib
Add, Long, Long, (A,B) - Une fonction qui ne sert strictement à rien !
Long | StdCall
Dans le dossier SDK de votre PB , il y a librarymaker.exe, lancer le en mode admin, une petite fenêtre va s'ouvrir , et va vous demander de remplir 2 champs, le premier "object path" est le chemin du fichier .obj & .desc , normalement , le même répertoire. le second , c'est l'emplacement des userlib de pb , généralement : "C:\Program Files (x86)\PureBasic\PureLibraries\UserLibraries\"
Coché la case process whole directory , ca évitera des warnings concernant des fonctions "non debug" , puis cliqué sur start, la case de compression peu être coché.
et voila , votre userlib faite uniquement en PB est faite. elle doit apparaitre à son emplacement. lancer PB , si vous êtes déjà dedans relancé le compilateur.
Si vous avez des question concernant le .Desc, merci de lire Readme.txt présent dans le dossier SDK de votre install PB. il est pas là pour rien.
Vous avez toute les armes pour refaire un tailbite opensource.
@++
Edit :
Si vous avez une erreur avec le debbuger lors de l'utilisation de votre lib , renommé votre fichier .obj et votre .desc avec le même nom :
MaLib.obj
MaLib.desc
la doc du readme dit :
The commands available in a PureLibrary are described in a file, called
'LibraryName.Desc'. Inside, you can put every commands, which langage you've
used to code your library, and more. Every line beginning by a semi-column ';'
is considered as a comment (like in PureBasic).