C gcc вопрос компиляции и makefiles - PullRequest
0 голосов
/ 27 января 2011

Даже не совсем уверен, что мой вопрос. Суть в том, что для класса я должен добавить некоторые функции в этот файл c, и он поставляется с удобным make-файлом.

CFLAGS=-DUNIX -lreadline -lcurses -ansi -pedantic-errors
DEBUG=-g
#DEBUG=

all: shell

shell:  shell.c parse.c parse.h
    gcc $(CFLAGS) $(DEBUG) shell.c parse.c -o shell
clean:
    rm -f shell *~

Я должен добавить функции в shell.c. Я очень плохо знаком с C (обычно использую c ++ или c #), поэтому тестирую мелочи в отдельном небольшом файле tests.c. Например, посмотреть, что именно возвращают определенные системные вызовы, как правильно их печатать и т. Д. В любом случае, tests.c, похоже, соответствует различным стандартам компилятора c, или я компилирую это неправильно. Если я случайно использую //, чтобы закомментировать что-то или объявить переменную где-то, кроме как в начале в shell.c, компилятор кричит на меня. В тестах все равно.

Я компилирую tests.c с помощью "gcc tests.c -o tests" Если я скомпилирую оболочку, используя "gcc shell.c parse.c -o shell", она скомпилируется нормально, но ее запуск просто вызывает ошибку сегментации. Я хотел бы спросить моего ТА об этом, но каждый раз, когда я, как он, что-то отвечаю на совершенно другой вопрос ...

Есть мысли о том, что здесь происходит? Возможно, точка в правильном направлении, по крайней мере?

Ответы [ 4 ]

1 голос
/ 27 января 2011

Проблема в том, что ваш make-файл включает в себя -ansi -pedantic-errors флаги для компилятора. Это заставляет его использовать очень старую версию C. Возможно, этот Makefile был предоставлен вашим инструктором, и он так хочет? Это не редкость.

Чтобы использовать эти новые функции (// комментарии, автоматические переменные в любом месте блока), просто отбросьте эти два флага. Если у вас есть свобода, я рекомендую также использовать -std=c99 -Wall.

1 голос
/ 27 января 2011

-ansi -pedantic-errors предотвращает наличие примесей, таких как // и определения переменных в середине функции. Удалите это, и вы сможете согрешить.

Что касается ошибки сегментации, лучше всего запустить программу через gdb, чтобы увидеть, где она падает.

1 голос
/ 27 января 2011

Чтобы заставить GCC принимать соглашения C99, скажите ему сделать это:

gcc -std=c99 ...
gcc -std=gnu99 ...

Итак, добавьте -std=gnu99 к вашему значению CFLAGS и удалите -ansi, что эквивалентно -std=c89.Если вам необходимо кодировать в соответствии со стандартами C89, не используйте // комментарии.

Мы не можем сказать, что вызывает дамп ядра - но возможно, вы пытаетесь где-то изменить строковый литерал, илилюбая из множества других проблем.

0 голосов
/ 27 января 2011

Почему вы компилируете, вызывая gcc напрямую вместо использования make-файла? Makefile добавляет ряд дополнительных параметров командной строки gcc, которые, скорее всего, важны. Видите ли вы то же поведение, если вы компилируете, используя make all?

Поскольку вы новичок в C, я бы рекомендовал добавить -Wall в строку CFLAGS. Это активирует все предупреждения компилятора, которые могут предупредить вас о незначительной ошибке, которую вы могли бы пропустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...