Page 1 sur 1

POLINK: error: Unresolved external symbol '_PB_Object_xxx

Publié : dim. 04/oct./2015 21:34
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 ?

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : dim. 04/oct./2015 22:22
par G-Rom
un lien pas résolu , tu as compilé avec quoi ?

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : lun. 05/oct./2015 0:09
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.

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : lun. 05/oct./2015 5:54
par comtois
G-Rom a écrit :un lien pas résolu , tu as compilé avec quoi ?
Visual Studio 2013

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : lun. 05/oct./2015 5:56
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.

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : lun. 05/oct./2015 7:44
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.

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : lun. 05/oct./2015 10:00
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

Re: POLINK: error: Unresolved external symbol '_PB_Object_xx

Publié : lun. 05/oct./2015 12:16
par comtois
Super ça marche, merci.