Ошибка компиляции C-программы - PullRequest
0 голосов
/ 07 июня 2011

Я пытаюсь скомпилировать и установить программу, созданную в 1997 году. Я использую gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50) и CentOS версии 5.5 (Final).При попытке выполнить команду 'make', находясь в каталоге SOURCE программы, я получаю следующую ошибку:

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

После первоначального рассмотрения этой ошибки c-кода я попытался скомпилировать ее наMac OSX 10.6.7 с i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc., сборка 5664).На этот раз я получил ошибку на шаг после первоначальной ошибки, подразумевая, что в игре определенно есть несовместимость с версией gcc.На этот раз ошибка была:

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

C программирование и make-файлы мне совершенно чужды, поэтому я действительно понятия не имею, с чего начать.Я также могу предоставить любую другую информацию, которая поможет в устранении этой проблемы.

Метод select_lines, определенный в select.c, выглядит следующим образом:

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);
    }
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Единственная строка, которая содержит сомнительный прирост:

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

Вы можете уменьшить его до следующего кода:

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

Второе назначение компилируется - и правильно увеличиваетсязначение целого числа, на которое указывает указатель void lines, при условии, что lines надлежащим образом инициализировано.

Дважды определенный символ _Bos означает, что есть два файла, которые определяют что-то, называемое Bosв исходном коде.Одним из них является файл cass.o в библиотеке libscol.a.Другой, вероятно, sents.c.Вы должны будете сделать один или другой статический, предполагая, что они делают то же самое.Или оба статические, если нет другого файла, который использует символ.Или вам может потребоваться изменить одну декларацию на extern.Немного зависит от того, что Bos - переменная или функция.

0 голосов
/ 08 июня 2011

Ошибка в строке № 84 в функции select_lines

select.c: в функции «select_lines»: select.c: 84: ошибка: недопустимое значение l в инкременте

GCC больше не допускает приведение с левой стороны. Язык C не допускает этого, и gcc становится более строгим в отношении следования спецификации C.

Вот почему генерируется эта ошибка lvalue. Вы должны удалить все левые заклинания, если они есть.

Возможно, target = * ((int *) lines) ++; htis содержит ошибку.

сделай так,

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