fonction Import -> Erreur du Linker

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

fonction Import -> Erreur du Linker

Message par JohnJohnsonSHERMAN »

Tout à l'heure, j'ai essayé d'exécuter l'exemple de PB sur la fonction Import (j'avais besoin d'importer des fonctions depuis une lib pour gérer un robot), le probléme c'est que lors de la compilation, j'ai une erreur du linker :

Code de l'exemple de PB :

Code : Tout sélectionner

Import "User32.lib"
   
    ; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
    ; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
    ;
    MessageBoxA(Fenetre.i, Corps$, Titre$, Options.i = 0)
   
    ; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
    ; nom de la fonction n'est pas le même que celui utilisé par le symbole
    ;
    BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxA@16"
                                                   
  EndImport
 
  MessageBoxA(0, "Salut", "le Monde") ; Nous ne précisons pas les options
  BoiteDeMessage(0, "Salut", "le Monde 2", 0)
Erreur obtenue :
---------------------------
PureBasic - Linker error
---------------------------
POLINK: error: Unresolved external symbol '_MessageBoxA@16'.

POLINK: fatal error: 1 unresolved external(s).


---------------------------
OK
---------------------------
Je suis sous Windows 10 x64, PB 5.42 LTS (x64)... c'est quand même bizarre comme probléme non? Une erreur dans un exemple de PB !
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: fonction Import -> Erreur du Linker

Message par Ar-S »

tu as décoché l'unicode ?
Chez moi en 5.42 x86 ça marche sans unicode.
Avec unicode les boites s'affichent aussi mais le texte s'affiche incorrectement.

Si tu es en x64 utilise importC au lieu de import pour voir
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: fonction Import -> Erreur du Linker

Message par Fred »

L'exemple n'est fonctionnel que sur Windows x86, en ascii, ce qui n'est pas normal pour un exemple de la doc. Je vais le modifier.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: fonction Import -> Erreur du Linker

Message par comtois »

Désolé pour le hors sujet, mais tant qu'à reprendre un exemple faudrait jeter un oeil sur celui-ci "PureBasic\Examples\Sources - Advanced\Atomic Web Server"

Apparemment il date un peu, avec les nouvelles possibilités de PureBasic y'aurait moyen de l'arranger un peu :)

Voir les critiques ici
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: fonction Import -> Erreur du Linker

Message par Mesa »

Je fais des modifs sur la doc dû au compilo unicode only, ya beaucoup d'exemples à revoir et celui là m'a échappé.

Mesa.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: fonction Import -> Erreur du Linker

Message par JohnJohnsonSHERMAN »

Du coup, on fait comment en x64, unicode?
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: fonction Import -> Erreur du Linker

Message par Zorro »

JohnJohnsonSHERMAN a écrit :Du coup, on fait comment en x64, unicode?
comme ça !

Code : Tout sélectionner

Import "User32.lib"
	; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
	; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
	;
	MessageBoxA(Fenetre.i, Corps$, Titre$, Options.i = 0)
	; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
	; nom de la fonction n'est pas le même que celui utilisé par le symbole
	;
	BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxA@16"
EndImport
Declare.s makeutf8text(text.s)

MessageBoxA(0, MakeUTF8Text("Salut"), MakeUTF8Text("le Monde")) ; Nous ne précisons pas les options
BoiteDeMessage(0, MakeUTF8Text("Salut"),MakeUTF8Text("le Monde 2"), 0)


Procedure.s MakeUTF8Text(Text.s)
	Static Buffer
	Buffer = UTF8(Text.s)
	PokeS(@buffer, text.s, -1, #PB_UTF8)
	sortie$=peeks(@buffer)
	ProcedureReturn sortie$
EndProcedure


ps: faudrai inclure cette fonction

Code : Tout sélectionner

 MakeUTF8Text(Text.s)
dans Purebasic .... on a pas fini de galerer avec l'unicod ....
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: fonction Import -> Erreur du Linker

Message par Fred »

Autant utilser les API unicode si tu compiles en unicode, je ne vois pas ou est la galere:

Code : Tout sélectionner

Import "User32.lib"
   ; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
   ; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
   ;
   MessageBoxW(Fenetre.i, Corps$, Titre$, Options.i = 0)
   ; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
   ; nom de la fonction n'est pas le même que celui utilisé par le symbole
   ;
   CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
     BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "MessageBoxW"
   CompilerElse
     BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxW@16"
   CompilerEndIf
EndImport

MessageBoxW(0, "Salut", "le Monde") ; Nous ne précisons pas les options
BoiteDeMessage(0, "Salut", "le Monde 2", 0)
Ou si tu veux pour une raison inconnue continuer à utiliser à utiliser l'appel ASCII, les pseudotypes sont la pour t'aider :)

Code : Tout sélectionner

Import "User32.lib"
   ; Pas besoin d'utiliser 'As' car PureBasic préfixe la fonction correctement
   ; Nous définissons également le paramètre 'Options' comme facultatif, avec une valeur par défaut de 0 (quand il est omis)
   ;
   MessageBoxA(Fenetre.i, Corps.p-ascii, Titre.p-ascii, Options.i = 0)
   ; Cette fois PureBasic ne peut pas se débrouiller tout seul, car le
   ; nom de la fonction n'est pas le même que celui utilisé par le symbole
   ;
   CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
     BoiteDeMessage(Fenetre.i, Corps.p-ascii, Titre.p-ascii, Options.i) As "MessageBoxA"
   CompilerElse
     BoiteDeMessage(Fenetre.i, Corps.p-ascii, Titre.p-ascii, Options.i) As "_MessageBoxA@16"
   CompilerEndIf
EndImport

MessageBoxA(0, "Salut", "le Monde") ; Nous ne précisons pas les options
BoiteDeMessage(0, "Salut", "le Monde 2", 0)
Il faut arreter avec ce rejet visceral de l'unicode, et plutot essayer d'évoluer un peu !
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: fonction Import -> Erreur du Linker

Message par Zorro »

Fred a écrit :Autant utilser les API unicode si tu compiles en unicode, je ne vois pas ou est la galere:

je l'aurai un jour..... je l'aurai !


ps: en plus dans la doc a la rubrique [mots clefs avancés] ---pseudo-type , le meme exemple est donné


Image
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: fonction Import -> Erreur du Linker

Message par Mesa »

Pour info, aucunes des solutions proposées dans ce fil ne fonctionnent avec xp32 et v550b2.

M.
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: fonction Import -> Erreur du Linker

Message par Fred »

Quelle est l'erreur ?
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: fonction Import -> Erreur du Linker

Message par JohnJohnsonSHERMAN »

@Mesa : Je plussoie, sous XP x32, il n'y a certes plus d'erreur de linker mais aucune boite de message ne s'affiche...
@Fred : pas d'erreur mais pas d'effet non plus, rien ne se passe... je vais tester sous W10 x64 la version unicode et la pseudo-ascii, et je te tiens au courant.
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: fonction Import -> Erreur du Linker

Message par Mesa »

Même chose que sherman, pas d'erreur, rien ne se passe, rien ne s'affiche.

M.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: fonction Import -> Erreur du Linker

Message par Mesa »

Ça marche si au préalable on ouvre une fenêtre ou un requester:

Code : Tout sélectionner

MessageRequester("ok","azerty")

Import "User32.lib"
  
  ; Nous utilisons le pseudotype 'p-unicode' pour les paramètres chaîne, car
  ; MessageBoxW() est une fonction unicode seulement. Le compilateur va
  ; automatiquement convertir les chaînes en unicode quand nécessaire.
  ;
  MessageBoxW(Fenetre.i, Corps$, Titre$, Options.i = 0)
  ;MessageBoxW(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l=0) ; fonctionne
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64 
    BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "MessageBoxW" 
  CompilerElse 
    BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxW@16"
    BoiteDeMessage2(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l ) As "_MessageBoxW@16"  
  CompilerEndIf 
  
EndImport

; Cela fonctionnera correctement en mode ascii et en mode unicode, même si l'API est uniquement
; unicode car le compilateur s'occupera lui-même de la conversion.
;
MessageBoxW(0, "Salut", "le Monde") 
BoiteDeMessage(0, "Salut 2", "le Monde 2",0)
BoiteDeMessage2(0, "Salut 3", "le Monde 3",0)

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 220, 100, "Exemple...", #PB_Window_SystemMenu)
  
  ButtonGadget  (1, 10, 60, 200, 30, "Fermer")
  
  Import "User32.lib"
    
    ; Nous utilisons le pseudotype 'p-unicode' pour les paramètres chaîne, car
    ; MessageBoxW() est une fonction unicode seulement. Le compilateur va
    ; automatiquement convertir les chaînes en unicode quand nécessaire.
    ;
    MessageBoxW(Fenetre.i, Corps$, Titre$, Options.i = 0)
    ;MessageBoxW(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l=0) ; fonctionne
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x64 
      BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "MessageBoxW" 
    CompilerElse 
      BoiteDeMessage(Fenetre.i, Corps$, Titre$, Options.i) As "_MessageBoxW@16"
      BoiteDeMessage2(Fenetre.l, Corps.p-unicode, Titre.p-unicode, Options.l ) As "_MessageBoxW@16"  
    CompilerEndIf 
    
  EndImport
  
  ; Cela fonctionnera correctement en mode ascii et en mode unicode, même si l'API est uniquement
  ; unicode car le compilateur s'occupera lui-même de la conversion.
  ;
  MessageBoxW(0, "Salut", "le Monde") 
  BoiteDeMessage(0, "Salut 2", "le Monde 2",0)
  BoiteDeMessage2(0, "Salut 3", "le Monde 3",0)
  
  Repeat
    Event = WaitWindowEvent()
    
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 
            CloseWindow(0)
            End  
        EndSelect
        
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf

C'est le même "problème" qu'avec les fonctions sonores, il faut au moins un requester pour que ça fonctionne sous XP.

M.
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: fonction Import -> Erreur du Linker

Message par Fred »

WinXP necessite peut etre l'appel à InitCommonControlsEx_() et CoInitialize_()
Répondre