2011-06-07 3 views
0

Je suis en train de compiler et d'installer un programme créé en 1997. J'utilise gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50) et CentOS version 5.5 (Final). Tout en essayant de faire un « make » commande alors que dans le répertoire source du programme, je reçois l'erreur suivante:Erreur de compilation du programme C

gcc -g -w -I/home/shahw/opinionfinder/software/scol1k/objs -I. -DDEBUG -DUNIX dump.c -L/home/shahw/opinionfinder/software/scol1k/objs -lscol -lm -o dump 
gcc -g -w -I/home/shahw/opinionfinder/software/scol1k/objs -I. -DDEBUG -DUNIX ngram.c -L/home/shahw/opinionfinder/software/scol1k/objs -lscol -lm -o ngram 
gcc -g -w -I/home/shahw/opinionfinder/software/scol1k/objs -I. -DDEBUG -DUNIX reg.c -L/home/shahw/opinionfinder/software/scol1k/objs -lscol -lm -o reg 
gcc -g -w -I/home/shahw/opinionfinder/software/scol1k/objs -I. -DDEBUG -DUNIX select.c -L/home/shahw/opinionfinder/software/scol1k/objs -lscol -lm -o select 
select.c: In function ‘select_lines’: 
select.c:84: error: invalid lvalue in increment 
make[1]: *** [select] Error 1 
make[1]: Leaving directory `/home/shahw/opinionfinder/software/scol1k/tools' 
make: *** [modules] Error 2 

Après avoir examiné d'abord cette erreur c-code, j'ai essayé de compiler ce sur un Mac OS X 10.6.7 avec i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664). Cette fois j'ai eu une erreur un pas après l'erreur d'origine impliquant qu'il y a définitivement une incompatibilité avec la version gcc en jeu. Cette fois, l'erreur était:

gcc -g -w -I/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -I. -DDEBUG -DUNIX dump.c -L/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -lscol -lm -o dump 
gcc -g -w -I/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -I. -DDEBUG -DUNIX ngram.c -L/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -lscol -lm -o ngram 
gcc -g -w -I/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -I. -DDEBUG -DUNIX reg.c -L/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -lscol -lm -o reg 
gcc -g -w -I/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -I. -DDEBUG -DUNIX select.c -L/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -lscol -lm -o select 
gcc -g -w -I/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -I. -DDEBUG -DUNIX sents.c -L/Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs -lscol -lm -o sents 
ld: duplicate symbol _Bos in /Users/shahjahanwarraich/Desktop/opinionfinderv1.5/software/scol1k/objs/libscol.a(cass.o) 
and /var/folders/F5/F5WuhlFlHcetJlreJ+GlMk+++TI/-Tmp-//ccjhIM0Y.o 
collect2: ld returned 1 exit status 
make[1]: *** [sents] Error 1 
make: *** [modules] Error 2 

programmation C et makefiles sont tout à fait étranger à moi donc je n'ai vraiment aucune idée par où commencer. Je peux également fournir toute autre information qui aidera à déboguer ce problème.

méthode select_lines définie dans select.c est la suivante:

select_lines (int type, void *lines, int n, FILE *infile, FILE *outfile) 
{ 
    char line[1024]; 
    int i, current = 0, target; 
    struct entry *e; 
    LinesA = make_aarray(SelectAlloc, sizeof(struct entry)); 

    /** Scan in the lines **/ 
    switch (type) { 

     case LINESFILE: 
    while (scan_int(target, lines) != EOF) { 
     new_line(target); 
    } 
    break; 

     case LINESLIST: 
    for (; n > 0; n--) { 
     target = *((int *)lines)++; 
     new_line(target); 
    } 
    break; 

     case LINESRANGE: 
    for (target = ((int *)lines)[0]; target <= ((int *)lines)[1]; target++) { 
     new_line(target); 
    } 
    break; 

     default: error("select_lines: Bad type"); 
    } 

    Lines = (struct entry *) LinesA->contents; 

    /** Sort by txt sequence **/ 
    qsort(Lines, NLines, sizeof(struct entry), txtcmp); 

    /** Extract lines **/ 
    current = -1; 
    for (i = 0; i < NLines; i++) { 
    target = Lines[i].txt; 
    if (target < current) error("sort failed"); 
    if (current < target) { /* careful: it's possible to select the same line twice */ 
     while (++current < target) { 
     skip_line(infile); 
     } 
     if (scan_line(line, 1024, infile) == EOF) { 
     fprintf(stderr, "Premature end of text file"); 
     exit(1); 
     } 
    } 
    Lines[i].line = copy_string(line); 
    } 

    /** Resort by smp sequence **/ 
    qsort(Lines, NLines, sizeof(struct entry), smpcmp); 

    /** Output **/ 
    for (i = 0; i < NLines; i++) { 
    fprintf(outfile, "%s\n", Lines[i].line); 
    } 
} 
+1

Afficher les lignes 80-90 de select.c –

+0

@William Pursell. La question a été mise à jour avec la fonction select_lines. Merci. –

Répondre

0

Il y a une erreur dans la ligne n ° 84 en fonction select_lines

select.c: Dans la fonction 'select_lines': select.c: 84: erreur: lvalue invalide en incrément

GCC ne permet plus les lancers sur le côté gauche. Le langage C ne le permet pas, et gcc devient plus strict sur le fait de suivre la spécification C.

C'est la raison pour laquelle cette erreur lvalue est générée. Vous devez supprimer toute distribution de gauche si elle est présente.

Peut-être, target = * ((int *) lines) ++; htis contient l'erreur.

fais comme ça,

a1=(int *)lines; 
target=*a1++; 
0

La seule ligne qui contient un incrément qui est douteux est:

target = *((int *)lines)++; 

Vous pouvez réduire ce le code suivant:

void select_lines(void *lines) 
{ 
    int target; 
    target = *((int *)lines) ++; // Error/warning 
    target = (*((int *)lines))++; // Clean 
} 

La deuxième affectation compile - et incrémente correctement la valeur de l'entier pointé par le point vide ter lines, en supposant que lines est initialisé de manière appropriée. Le symbole doublement défini _Bos signifie qu'il y a deux fichiers qui définissent quelque chose appelé Bos dans le code source. L'un est le fichier cass.o dans la bibliothèque libscol.a. L'autre est probablement sents.c. Vous devrez rendre l'un ou l'autre statique, en supposant qu'ils font la même chose. Ou les deux statiques, sauf s'il existe un autre fichier qui utilise le symbole. Ou vous pouvez juste besoin de changer une déclaration à extern. Cela dépend un peu de ce qu'est Bos - une variable ou une fonction.