Как я могу скомпилировать код C, который уже был предварительно обработан с помощью GCC? - PullRequest
1 голос
/ 25 января 2010

Я выполняю некоторую обработку исходного кода между предварительной обработкой C и компиляцией C. На данный момент я:

  1. gcc -E file.c > preprocessed_file.c.
  2. Делайте больше вещей для preprocessed_file.c.
  3. Продолжить компиляцию с preprocessed_file.c.

Если вы попытаетесь скомпилировать preprocessed_file.c, как если бы это был обычный C (шаг 3), вы получите много следующего:

/usr/include/stdio.h:257: error: redefinition of parameter ‘restrict’
/usr/include/stdio.h:257: error: previous definition of ‘restrict’ was here
/usr/include/stdio.h:258: error: conflicting types for ‘restrict’
/usr/include/stdio.h:258: error: previous definition of ‘restrict’ was here
/usr/include/stdio.h:260: error: conflicting types for ‘restrict’
[...]

И это просто использование #include <stdio.h> в file.c. К счастью, есть возможность сообщить GCC, что он работает с кодом C, который уже был предварительно обработан, указав язык, который компилируется как c-cpp-output (см. -x на этой странице). Но это не работает. Я просто получаю это:

$ gcc -x c-cpp-output -std=c99 bar.c
i686-apple-darwin9-gcc-4.0.1: language c-cpp-output not recognized
i686-apple-darwin9-gcc-4.0.1: language c-cpp-output not recognized
ld warning: in bar.c, file is not of required architecture
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.5.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

И точно такой же ответ с более новой версией GCC:

$ gcc-mp-4.4 -x c-cpp-output -std=c99 bar.c
[same error stuff comes here]

Ответы [ 3 ]

4 голосов
/ 25 января 2010

Предупреждения о restrict связаны с тем, что это ключевое слово в C99. Итак, вы должны предварительно обработать и скомпилировать ваш код, используя тот же стандарт.

Ошибка в _main заключается в том, что ваш файл не определяет main()? Выполнение следующих действий должно работать:

gcc -c -std=c99 bar.c

и создаст bar.o. Если в вашем bar.c определено a main(), возможно, оно не называется bar.c? Например, я создал bar.c с действительным main() и сделал:

gcc -E -std=c99 bar.c >bar.E
gcc -std=c99 bar.E

и получил:

Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

В этом случае вам нужна опция -x c:

gcc -x c -std=c99 bar.E

(Или, как упоминал Николай, вам нужно сохранить предварительно обработанный файл в bar.i.)

3 голосов
/ 25 января 2010

Похоже на опечатку в документации GCC - вместо этого попробуйте '-x cpp-output'.

gcc -E helloworld.c > cppout
gcc -x cpp-output cppout -o hw
./hw
Hello, world!
2 голосов
/ 25 января 2010

Сохраните файл с суффиксом .i после предварительной обработки. Страница man Gcc:

       file.i
           C source code which should not be preprocessed.

       file.ii
           C++ source code which should not be preprocessed.

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