高级C和C ++编译:无法编译本书中提到的示例程序

Advanced C and C++ compiling: unable to compile the example program mentioned in the book

我正在阅读Milan Stevanovic撰写的名为"高级C和C ++编译"的书

以下是本书的快照,其次是我面临的问题。

概念图:演示项目

用于构建此简单项目的开发环境将基于运行的gcc编译器
Linux操作系统。清单2-1到2-3包含演示项目中使用的代码。

清单2-1。 function.h

1
2
3
4
5
6
7
8
9
#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

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9
10
11
#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编译器提供的模式只对输入源文件执行预处理阶段:

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

除非另有说明,否则预处理器的输出是与输入文件同名的文件
其文件扩展名为.i。在文件function.c上运行预处理器的结果如清单2-4所示。

清单2-4。 function.i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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,则可以获得更紧凑和更有意义的预处理器输出

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

这导致了清单2-5中所示的预处理文件。

清单2-5 function.i(修剪版)

1
2
3
4
5
6
7
8
9
10
11
12
13
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编译程序时,以下是我面临的错误
来自终端的快照。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

如何摆脱这种情况并继续学习课程?
请建议。


-i不是有效的命令行选项 - 我不确定这本书的来源。 为了只运行预处理器,您应该使用选项-E


我是这本书的技术评论员,作者让我代表他发布这个解释:

The error you found is indeed an error, introduced in the very late stage of book proofreading/editing. Sorry for stepping on it + for book errata still not being printed out (will happen some time soon).


试试这个

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

没有-i选项,它不是gcc选项。

注意:这个答案在我意识到误解了这个问题之后得到了解决,所以我修复了保留它而不是删除它,但凯蒂确实在我做之前回答了它。


请尝试以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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