高级C和C++编译:无法编译书中提到的示例程序 我正在读一本叫做Milan Stevanovic的高级C和C++编译的书。

高级C和C++编译:无法编译书中提到的示例程序 我正在读一本叫做Milan Stevanovic的高级C和C++编译的书。,c++,c,linux,gcc,compiler-errors,C++,C,Linux,Gcc,Compiler Errors,下面是书中的快照,接着是我面临的问题 概念说明:演示项目 用于构建此简单项目的开发环境将基于在上运行的gcc编译器 Linux。清单2-1到2-3包含演示项目中使用的代码 清单2-1。函数.h 清单2-2。功能c 清单2-3。main.c 演示项目预处理示例: gcc编译器提供仅对输入源文件执行预处理阶段的模式: gcc -i <input file> -o <output preprocessed file>.i 如果很少向gcc传递额外的标志,则可以获得更紧凑、更有

下面是书中的快照,接着是我面临的问题

概念说明:演示项目

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

清单2-1。函数.h

清单2-2。功能c

清单2-3。main.c

演示项目预处理示例:

gcc编译器提供仅对输入源文件执行预处理阶段的模式:

gcc -i <input file> -o <output preprocessed file>.i
如果很少向gcc传递额外的标志,则可以获得更紧凑、更有意义的预处理器输出,如

gcc -E -P -i <input file> -o <output preprocessed file>.i
显然,预处理器替换了符号乘法器,其实际值基于 USE_定义了第一个_选项变量,最终为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
我如何摆脱这种情况,继续学习这门课程? 请建议。

试试这个

gcc -E -P function.c -o function.i
如果没有-i选项,它就不是gcc选项

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

试试这个

gcc -E -P function.c -o function.i
如果没有-i选项,它就不是gcc选项


注意:在我意识到你误解了这个问题后,这个答案被修正了,所以我决定保留它,而不是删除它,但Katie在我之前就回答了它。

-我不是一个有效的命令行选项-我不确定这本书是从哪里得到的。为了只运行预处理器,您应该使用选项-E。

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

尝试以下代码:

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

请尝试以下代码:

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

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

您发现的错误确实是一个错误,是在书籍校对/编辑的后期阶段引入的。很抱歉踩到它+因为还没有打印出来的书籍勘误表很快就会出现


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

您发现的错误确实是一个错误,是在书籍校对/编辑的后期阶段引入的。很抱歉踩到它+因为还没有打印出来的书籍勘误表很快就会出现

从本书示例中的.i输出文件判断,错误似乎在实用程序本身

不要使用gcc,而是使用cpp。gcc在引擎盖下使用cpp C预处理器来处理宏扩展和标头包含。CPP的输出是.c文件的.i文件,C++的.c/+p> cpp function.c>function.i 从本书示例中的.i输出文件判断,错误似乎在实用程序本身

不要使用gcc,而是使用cpp。gcc在引擎盖下使用cpp C预处理器来处理宏扩展和标头包含。CPP的输出是.c文件的.i文件,C++的.c/+p> cpp function.c>function.i
也许这本书使用了不同于GCC的编译器这是我的第一个想法,但问题中的文本似乎直接引用了这本书。我感到困惑,因为OP发布了预处理文件,我以为他想编译代码,而不是在上面运行预处理器,我以为他成功了这一步,但不管怎么说,我是从哪里来的?如果它是从书中得到的,可能它在以前的gcc版本中是有效的。我只是在谷歌图书中找到了它,这肯定是从书中直接引用的。它也发表在不到一年前,所以GCC的旧版本不应该受到指责。我不认为他们会改变这样的一面大旗。谁知道呢……这正是我所倾向的,没有读更多的书来看看它是否解释了环境是如何建立的。不过,作为一本教科书,这是非常草率的。我注意到出版商的页面有一种提交勘误表的方法,也许我以后会在那里发表评论。也许这本书使用了不同于GCC的编译器这是我的第一个想法,但问题中的文本似乎直接引用了这本书。我感到困惑,因为OP发布了预处理文件,我以为他想编译代码,不是在上面运行预处理器,我以为他在这一步上成功了,但不管怎样,-I来自哪里?如果它是从书中得到的,可能它在以前的gcc版本中是有效的。我只是在谷歌图书中找到了它,这肯定是从书中直接引用的。它也发表在不到一年前,所以GCC的旧版本不应该受到指责。我不认为他们会改变一个m
不管怎么说,都是这样的。谁知道呢……这正是我所倾向的,没有读更多的书来看看它是否解释了环境是如何建立的。不过,作为一本教科书,这是非常草率的。我注意到出版商的页面有一种提交勘误表的方法,也许我以后会在这里发表评论。这是gcc-E-P-I-o吗?我真的是从书中学来的吗?你刚刚错过了一个学习如何查找正确标志的好机会。是的,gcc-E-P-I-o是从书中学来的?你应该尝试gcc-help and man gcc或阅读-比在书中提问更快,这可能是一个错误。这是gcc-E-P-i-o吗?我真的是从书中学来的吗?你刚刚错过了一个学习如何查找正确标志的好机会。是的,gcc-E-P-i-o是从书中学来的?你应该尝试gcc-help and man 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
gcc -E -P function.c -o function.i
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