POLINK: error: Unresolved external symbol '_PB_Object_xxx

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

POLINK: error: Unresolved external symbol '_PB_Object_xxx

Message par comtois »

J'ai essayé de compiler l'exemple ObjectManagement du SDK, il fonctionne bien en mode debug, par contre sans le debug j'ai ces erreurs !
---------------------------
PureBasic - Linker error
---------------------------
POLINK: error: Unresolved external symbol '_PB_Object_GetObject'.

POLINK: error: Unresolved external symbol '_PB_Object_FreeID'.

POLINK: error: Unresolved external symbol '_PB_Object_CleanAll'.

POLINK: error: Unresolved external symbol '_PB_Object_Init'.

POLINK: error: Unresolved external symbol '_PB_Object_GetOrAllocateID'.

POLINK: fatal error: 5 unresolved external(s).
Qu'est-ce que j'ai oublié de faire ? Quelqu'un a une idée ?
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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par G-Rom »

un lien pas résolu , tu as compilé avec quoi ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par falsam »

Je ne dois pas avoir les yeux en face des trous. Je n'ai pas trouvé l'exemple ObjectManagement du SDK.

■ Voila un source qui permet de créer un objet et de l'initialiser avec un string. Une seconde fonction permet d'extraire le string de cet objet.
- CreateObject(Object, String.s) Création de l'objet.
- GetObjectString(Object) Retourne le string de l'objet.

Ce code génère effectivement des erreurs POLINK si je l’exécute sans le débogueur.

Code : Tout sélectionner

Import ""
  Object_GetOrAllocateID (Objects, Object.l) As "_PB_Object_GetOrAllocateID@8"
  Object_GetObject       (Objects, Object.l) As "_PB_Object_GetObject@8"
  Object_IsObject        (Objects, Object.l) As "_PB_Object_IsObject@8"
  Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) As "_PB_Object_EnumerateAll@12"
  Object_EnumerateStart  (Objects) As "_PB_Object_EnumerateStart@4"
  Object_EnumerateNext   (Objects, *object.Long) As "_PB_Object_EnumerateNext@8"
  Object_EnumerateAbort  (Objects) As "_PB_Object_EnumerateAbort@4"
  Object_FreeID          (Objects, Object.l) As "_PB_Object_FreeID@8"
  Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) As "_PB_Object_Init@12"
  Object_GetThreadMemory (MemoryID.l) As "_PB_Object_GetThreadMemory@4"
  Object_InitThreadMemory(Size.l, InitFunction, EndFunction) As "_PB_Object_InitThreadMemory@12"
EndImport

Structure sObject
  Object.l 
  string.s
EndStructure

Procedure FreeObject(Object.l)
  Shared gObject.l
  
  If Object<>#PB_Any And Object_IsObject(gObject, Object)
    Protected *object.sObject = Object_GetObject(gObject, Object)
    
    If *object  
      Debug "PB_Object " + Str(Object) + " détruit"
      Object_FreeID(gObject, Object)
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure

Procedure CreateObject(Object, String.s)
  Shared gObject.l
  Protected *object.sObject
  
  If Object And string
    If Not gObject
      gObject = Object_Init(SizeOf(sObject), 1, @FreeObject())
    EndIf
    
    *object = Object_GetOrAllocateID(gObject, Object)
    If *object
      *object\Object = Object 
      *object\string = string
      ProcedureReturn *object
    EndIf
  EndIf
EndProcedure

Procedure.s GetObjectString(Object)
  Shared gObject.l
  Protected *object.sObject = Object_GetObject(gObject, Object)
  
  If *object
    ProcedureReturn *object\string
  EndIf
EndProcedure

CreateObject(1, "Premier test")
Debug GetObjectString(1)

Result = CreateObject(#PB_Any, "Deuxiéme test")
Debug GetObjectString(Result)

;Destruction des objets
FreeObject(1)
FreeObject(Result)
Par contre il fonctionne parfaitement avec le débogueur.

■ J'ai vu sur le forum que ce problème pouvait être contourner de cette manière.

Code : Tout sélectionner

  If IsWindow(#PB_Any)
  EndIf
C'est étrange mais ça fonctionne. Peut être que Fred pourra en dire un peu plus.

J'ai donc modifié la procédure FreeObject(Object.l) de cette manière.

Code : Tout sélectionner

Procedure FreeObject(Object.l)
  Shared gObject.l
  
  If Object<>#PB_Any And Object_IsObject(gObject, Object)
    Protected *object.sObject = Object_GetObject(gObject, Object)
    
    If *object  
      Debug "PB_Object " + Str(Object) + " destroyed"
      Object_FreeID(gObject, Object)
      ProcedureReturn #True
    EndIf
  EndIf
  
  ;Solution de contournement
  If IsWindow(#PB_Any)
  EndIf
EndProcedure
Avec ou sans débogueur, le code fonctionne.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par comtois »

G-Rom a écrit :un lien pas résolu , tu as compilé avec quoi ?
Visual Studio 2013
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par comtois »

Je ne dois pas avoir les yeux en face des trous. Je n'ai pas trouvé l'exemple ObjectManagement du SDK.
il se trouve à cette adresse : \SDK\VisualC\ObjectManagement
falsam a écrit : ■ J'ai vu sur le forum que ce problème pouvait être contourner de cette manière.

Code : Tout sélectionner

  If IsWindow(#PB_Any)
  EndIf
C'est étrange mais ça fonctionne. Peut être que Fred pourra en dire un peu plus.
En effet c'est étrange, mais ça fonctionne, merci pour ta réponse complète et détaillée.
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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par G-Rom »

Au niveau de visual basic, tu as certainement le lien qui n'est pas fait avec la version release. regarde les differences entre release et debug. tu devrais trouver facilement. le fait de rajouter le morceau de code de falsam fait office de lien.
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par Fred »

Dans le .desc, il faut rajouter une dependence vers la lib "Object":

Code : Tout sélectionner

; Langage used to code the library: ASM or C
C

; Number of windows DLL than the library need
0

; Library type (Can be OBJ or LIB)
LIB

; Number of PureBasic library needed by the library
1
Object
edit: j'ai corrigé le probleme pour la prochaine beta
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Message par comtois »

Super ça marche, merci.
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.
Répondre