Расширенная компиляция C и C ++: не удалось скомпилировать пример программы, упомянутой в книге

0

Я читаю книгу под названием "Advanced C и C++ компиляция", Милан Стеванович

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


Концептуальная иллюстрация: демонстрационный проект

Среда разработки, используемая для создания этого простого проекта, будет основана на компиляторе gcc, работающем в Linux. В листингах от 2-1 до 2-3 содержится код, используемый в демонстрационном проекте.

Листинг 2-1. function.h

#pragma once
#define FIRST_OPTION
#ifdef FIRST_OPTION
#define MULTIPLIER (3.0)
#else
#define MULTIPLIER (2.0)
#endif

float add_and_multiply(float x, float y);

Листинг 2-2. function.c

int nCompletionStatus = 0;
float add(float x, float y)
{
    float z = x + y;
    return z;
}
float add_and_multiply(float x, float y)
{
    float z = add(x,y);
    z *= MULTIPLIER;
    return z;
}

Листинг 2-3. main.c

#include "function.h"
extern int nCompletionStatus = 0;
int main(int argc, char* argv[])
{
    float x = 1.0;
    float y = 5.0;
    float z;
    z = add_and_multiply(x,y);
    nCompletionStatus = 1;
    return 0;
}

Пример предварительной обработки проекта:

Компилятор gcc предоставляет режим, в котором выполняется только этап предварительной обработки на входных исходных файлах:

gcc -i <input file> -o <output preprocessed file>.i

Если не указано иное, вывод препроцессора - это файл, который имеет то же имя, что и входной файл, а расширение файла - .i. Результат выполнения препроцессора в файле function.c выглядит так, как показано в листинге 2-4.

Листинг 2-4. function.i

# 1 "function.c"
# 1 "
# 1 "
# 1 "function.h" 1
# 11 "function.h"
float add_and_multiply(float x, float y);
# 2 "function.c" 2
int nCompletionStatus = 0;
float add(float x, float y)
{
    float z = x + y;
    return z;
}
float add_and_multiply(float x, float y)
{
    float z = add(x,y);
    z *= MULTIPLIER;
    return z;
}

Более компактный и более значимый вывод препроцессора может быть получен, если в gcc передано несколько дополнительных флагов, например

gcc -E -P -i <input file> -o <output preprocessed file>.i

что приводит к предварительно обработанному файлу, показанному в листинге 2-5.

Листинг 2-5. function.i (Trimmed Down Version)

float add_and_multiply(float x, float y);
int nCompletionStatus = 0;
float add(float x, float y)
{
    float z = x + y;
    return z;
}
float add_and_multiply(float x, float y)
{
    float z = add(x,y);
    z *= 3.0;
    return z;
}

Очевидно, что препроцессор заменил символ MULTIPLIER, фактическое значение которого на основании того, что переменная USE_FIRST_OPTION была определена, оказалась 3.0.


Проблема:

Когда я компилирую программу, используя gcc, следую за ошибкой, с которой я сталкиваюсь с моментальным снимком с моего терминала.

gcc -i function.c -o function.i
cc1: error: unrecognized command line option '-i'

gcc function.c -o function.i
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o:
In function '_start':
(.text+0x18): undefined reference to 'main'
collect2: ld returned 1 exit status

$pwd
/home/adminuser/advance_compiling
$ll
total 20
drwxrwxr-x  2 adminuser adminuser 4096 Jan 10 23:51 ./
drwxr-xr-x 26 adminuser adminuser 4096 Jan 10 23:57 ../
-rw-rw-r--  1 adminuser adminuser  216 Nov 15 08:58 function.c
-rw-rw-r--  1 adminuser adminuser  163 Jan 10 23:33 function.h
-rw-rw-r--  1 adminuser adminuser  257 Dec 28 06:46 main.c

Как мне избавиться от этого и продолжить изучение курса? Пожалуйста, предложите.

  • 0
    этот gcc -E -P -i <input file> -o <output preprocessed file>.i действительно из книги?
  • 0
    Вы только что упустили прекрасную возможность узнать, как найти правильный флаг для использования.
Показать ещё 3 комментария
Теги:
gcc
compiler-errors

4 ответа

2
Лучший ответ

Я был техническим обозревателем книги, и автор попросил меня опубликовать это объяснение от его имени:

Обнаруженная вами ошибка действительно является ошибкой, введенной на очень поздней стадии коррекции/редактирования книг. Извините за то, что вы на нее набросились + для исправления ошибок в книгах, которые еще не распечатываются (это произойдет в ближайшее время).

  • 0
    Доступны ли сейчас опечатки?
7

-i не является допустимым вариантом командной строки - я не уверен, откуда -i книга. Чтобы просто запустить препроцессор, вы должны использовать опцию -E.

  • 0
    может быть, книга использует другой компилятор, чем GCC
  • 0
    Это была моя первая мысль, но текст в вопросе, кажется, прямо цитируется из книги.
Показать ещё 5 комментариев
0

Попробуй это

gcc -E -P function.c -o function.i

без опции -i, это не опция gcc.

Примечание: этот ответ был исправлен после того, как я понял, что неправильно понял вопрос, поэтому я решил сохранить его, а не удалять, но Кэти ответила на него, прежде чем я это сделал.

-3

Попробуйте следующий код:

function.c

#include "function.h"
int nCompletionStatus = 0;
float add(float x, float y)
{
    float z = x + y;
    return z;
}
float add_and_multiply(float x, float y)
{
    float z = add(x,y);
    z *= MULTIPLIER;
    return z;
}

main.c

    //#include "function.h"
    extern int nCompletionStatus;
    int main(int argc, char* argv[])
    {
        float x = 1.0;
        float y = 5.0;
        float z;
        z = add_and_multiply(x,y);
        nCompletionStatus = 1;
        return 0;
    }

Now execute:
gcc function.c main.c

otherwise 
gcc -c function.c
gcc function.o main.c

Ещё вопросы

Сообщество Overcoder
Наверх
Меню