Discussions au sujet des autres produits NI

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Inconsistent type declarations for external symbol

Bonjour,

 

Je viens de passer à la version 9.0.1 de CVI et j'essai de porter une appli qui a été développée sous la version 8.0 et qui fonctionne. Je l'ai également compilé avec CVI 8.5 et pas de pb.

 

Une erreur récurrente après la compilation avec la version 9.0.1 est la suivante:

 

" Inconsistent type declarations for external symbol  "ERR_declare_error_table" in modules ..."

 

Cette fonction, je l'utilise dans plusieurs développements, et une chose de curieuse, c'est qu'à chaque fois l'erreur est sur cette fonction alors que, je me répette, les softs fonctionnent parfaitement.

 

J'ai essayé avec différentes options de compilation, en vain.

 

Prototypde de la fonction:

ERRC ERR_declare_error_table (ERR_TYPE *error_type, char name_of_module[ERR_MAX_NAMEMODULE_LEN],                                           char file[ERR_MAX_FILENAME_LEN], UINT8 *ident);

 

Appel de la fonction:

ERR_declare_error_table (err_type, NAME_OF_MODULE, __FILE__, &err_ident);

 

 

D'avance, merci pour votre aide

 

 

 

 

Message 1 sur 8
5 318 Visites

(re)Bonjour

 

Il semblerait que cela vienne du fichier "windows.h".

Il faut que je l'inclus dans chaque fichier ".c" utilisant ma fonction.

 

Quelles pouraient être les modif dans "windows.h" qui entraine cette erreur (cf. ci-dessus)?

 

Merci

Message 2 sur 8
5 316 Visites

Bonjour,

 

Au niveau du build option, au niveau de C Language Option, pouvez-vous essayer de décocher l'option "Require function prototypes" et "Build with c99 extension".

 

Cordialement.
cvi.JPG

Nacer M. | Certified LabVIEW Architecte

0 Compliments
Message 3 sur 8
5 290 Visites

Bonjour,

 

Cette manip je l'ai déjà faite, et le résultat de la compilation est toujours le même " Inconsistent type declarations for external symbol".

 

Cédric

Message 4 sur 8
5 279 Visites
Pouvez vous alors poster votre code, que je regarde.

Cordialement.

Nacer M. | Certified LabVIEW Architecte

0 Compliments
Message 5 sur 8
5 275 Visites

Bonjour à tous

 

J'utilise le meme code que Cedric (celui-ci nous ayant sous traité une affaire contenant un module ayant cette fameuse fonction)

Je me suis retrouvé un temps avec cette erreur de linkage.

 

Par contre j'ai réussi à compiler mon appli avec d'ancienne source. De retour sur les nouvelles source l'erreur de linkage apparait de nouveau.

J'ai donc ajouté "Windows.h" dans "error_montoring.c" --> j'ai toujours les erreurs de linkage.

Avec le suppression de l'entete Windows.h (#include) j'ai enfin résussi à compiler mon application : plus aucunes erreurs de linkage.

Par méfiance j'ai rebooter ma machine croyant à une configuration momentané de CVI mais non cela compile bien désormais

 

Il faudrait que je fasse l'essai sur un autre PC pour boir si cela vient bien de CVI !

 

Ah l'informatique ... 🙂

 

Pierrick MADIOT

 

NOTE : je n'ai jamais eu l'option " Build with C99 ..." mais par contre l'autre option "Requie function ..." l'ai

0 Compliments
Message 6 sur 8
5 150 Visites

Bonsoir

 

Je suis reparti entre temps sur CVI 7.0 pour résoudre ce problème

Cependant j'ai besoin de miger sur CVI 9.1 (2009) et le problème se pose à nouveau avez vous pu analyser ces sources et déterminer une solution ?

 

PS : je peux vou transmettre les sources du programme

 

Cordialement

Pierrick MADIOT

0 Compliments
Message 7 sur 8
4 597 Visites

Bonjour

 

En fait en réfléchissant un peu plus sur le sujet, j'ai trouvé l'erreur de linkage :

En fait le prototype de la fonction étant :

ERRC ERR_declare_error_table (    ERR_TYPE * error, char name_of_module[ERR_MAX_NAMEMODULE_LEN],
                                            char file[ERR_MAX_FILENAME_LEN], UINT8 *ident)

L'erreur provient donc de ERR_TYPE d'après l'erreur de linkage :

typedef struct {
      INT8 code;                                /* code de l'erreur */
      char *text;                                /* NULL ou texte associé au code d'erreur */
} ERR_TYPE;

 

En fait INT8 était deja définit dans une librairie de mon programme "DEF.H" de cette façon : typedef char  INT8;

Hors LabWindows privilégie la bibrairie BaseTsd.h (en fait le SDK) ou INT8 est définit de cette façon typedef signed char INT8;


En attendant de trouver mieux (une directive de compilation) j'ai modifié ma structure de cette façon :

 

typedef struct {
      INT8 code;                                /* code de l'erreur */

      char code;                                /* code de l'erreur */
      char *text;                                /* NULL ou texte associé au code d'erreur */
} ERR_TYPE;

 

Et la miracle cela compile et link parfaitement ! J'ai ainsi économisé 300€

 

Par contre question il y a une directive de compilation SDK_CONFLICT_PRORITY qui permet de privilégier le SDK WINDOWS au SDK National Instruments : y a t-il une directive de compilation permettant de privilégié ma déclaration de type à celle du SDK (WINDOWS ou National Instruments) ?

 

Merci de votre réponse

 

Cordialement

 

Pierrick MADIOT

0 Compliments
Message 8 sur 8
4 579 Visites