2010-07-15 4 views
0

Cela me semble très curieux car le code se compile sans erreur sur un système Debian 5 mais sur un FreeBSD 7 j'obtiens une erreur de syntaxe ici sur la ligne 98 par exemple.Erreur de syntaxe portage du code C de Linux à FreeBSD

int ipmi_fru_get_board_info_mfg_time(ipmi_fru_t *fru, time_t *time); 

À l'origine, il y avait un saut de ligne entre * fru et time_t. Je ne sais pas ce qui pourrait causer ces erreurs de compilation, mais il me semblait important de mentionner le saut de ligne.

Ou celui-ci de la ligne 298 est resté complètement inchangé dans son format.

int ipmi_fru_get(ipmi_fru_t    *fru, 
    int      index, 
    char      **name, 
    int      *num, 
    enum ipmi_fru_data_type_e *dtype, 
    int      *intval, 
    time_t     *time, 
    char      **data, 
    unsigned int    *data_len); 

Ce sont les erreurs non modifiées transmises au terminal.

In file included from out_fru.c:37: 
../include/OpenIPMI/ipmi_fru.h:98: error: expected declaration specifiers or '...' before 'time_t' 
../include/OpenIPMI/ipmi_fru.h:298: error: expected declaration specifiers or '...' before 'time_t' 
../include/OpenIPMI/ipmi_fru.h:474: error: expected declaration specifiers or '...' before 'time_t' 
../include/OpenIPMI/ipmi_fru.h:559: error: expected declaration specifiers or '...' before 'time_t' 
../include/OpenIPMI/ipmi_fru.h:627: error: expected declaration specifiers or '...' before 'time_t' 

Les erreurs suivantes semblent être liées parce qu'elles affectent les fonctions déclarées sur les lignes ci-dessus du fichier d'en-tête ipmi_fru.h.

out_fru.c: In function 'ipmi_cmdlang_dump_fru_info': 
out_fru.c:87: warning: passing argument 7 of 'ipmi_fru_get' from incompatible pointer type 
out_fru.c:87: warning: passing argument 8 of 'ipmi_fru_get' from incompatible pointer type 
out_fru.c:87: error: too many arguments to function 'ipmi_fru_get' 

Quelle pourrait être la cause de ces erreurs de syntaxe spécifiques à la plate-forme étrange? Ma première pensée était un caractère non imprimable mais j'ai essayé de vérifier avec cat -e include/OpenIPMI/ipmi_fru.h | moins, tout ce que je vois sont des espaces et des sauts de ligne.

+3

Avez-vous vérifié si cela existe et quelle est la définition de cette structure? –

+0

Vous aviez absolument raison mon bon monsieur, apparemment vous n'avez pas besoin de temps.h inclus pour time_t sur Linux. Nouvelles à moi. –

Répondre

1

Dans ces types d'erreurs cryptées, la meilleure chose à faire est de lancer le préprocesseur et de voir ce qui sort. Parfois, un jeton est quelque part dans les en-têtes et il devient pratiquement impossible de savoir ce qui se passe.

Pour le faire, trouver la ligne de compilation pour ce fichier .c et l'exécuter comme:

cpp <all -I switches from the compilation line> <all -D switches> yourfile.c outfile.tmp 

Essayez de trouver la ligne correspondante dans outfile.tmp - il peut sembler un peu désordonné, mais chercher le nom de fichier original et linenumber - il ne devrait pas être trop difficile. Lorsque vous trouverez cette ligne, espérons qu'il ne devrait pas être trop difficile de localiser le problème réel.

0

L'utilisateur Praveen a bien répondu à ma question mais juste pour ne pas laisser le fil sans réponse je mentionnerai ce que j'ai découvert.

Le logiciel semble définir son propre time_t, ou bien Linux ne vous demande pas d'inclure time.h pour le type de données time_t.

De toute façon j'ai réussi à continuer mon portage en incluant simplement time.h sur FreeBSD.

+1

Vous devriez lire la norme (POSIX) pour déterminer quels en-têtes définissent 'time_t' plutôt que de se contenter d'essais et d'erreurs. Ou plutôt, celui qui a écrit le logiciel original aurait dû faire cela ... –

+0

Oui, ce processus de portage a principalement été la recherche d'en-têtes et leur disponibilité entre ces deux systèmes, en ce moment je travaille avec resolv.h. Et non ce n'est pas mon logiciel, j'espère juste l'utiliser sur FreeBSD par la suite. –

1

Bien vous/l'auteur original devez avoir inclus le fichier qui inclut l'en-tête où time_t est défini lorsque la compilation est réussie. Cependant, vous devez trouver correctement quel est ce fichier pour connaître la bonne solution au problème.

Vous ne pouvez pas supposer linux ne vous oblige pas à inclure le fichier qui secoue tous les principes de base de la programmation :). Qu'en est-il du fichier include pour la structure time_t?

+0

Il est probable qu'un autre en-tête système soit inclus, qui inclut indirectement l'en-tête qui définit 'time_t' sous Linux, mais pas sur FreeBSD. – caf

Questions connexes