Ошибка компиляции C-программы
Я пытаюсь скомпилировать и установить программу, созданную в 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 ответа
Ошибка в строке № 84 в функции select_lines
select.c: в функции 'select_lines': select.c:84: ошибка: недопустимое значение l в инкременте
GCC больше не допускает приведение с левой стороны. Язык C не допускает этого, и gcc становится более строгим в отношении следования спецификации C.
Вот почему эта ошибка lvalue генерируется. Вы должны удалить все оставшиеся актеры, если они есть.
Возможно, target = * ((int *) lines) ++; Это содержит ошибку.
сделай это так,
a1=(int *)lines;
target=*a1++;
Единственная строка, которая содержит сомнительный прирост:
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
is - переменная или функция.