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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级C和C++编译:无法编译书中提到的示例程序。相关的知识,希望对你有一定的参考价值。

我正在看Milan Stevanovic写的《高级C和C++编译》这本书。

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


概念图解。演示项目

用于构建这个简单项目的开发环境将基于在Linux上运行的gcc编译器。清单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 缩减后的版本

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按原样编译程序时,以下是我面临的错误Snapshot从我的终端。

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 而不是。

另一答案

试试这个

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

-i 选项,它不是一个 gcc 选项。

笔记: 这个答案在我意识到误解了问题之后被修正了,所以我修正了保留它,而不是删除它,但是。凯蒂 确实比我先回答了。

另一答案

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

在书中,我们没有使用 gcc,使用 cpp.gcc使用cpp(The C Preprocessor)来处理宏扩展和头包含。cpp的输出是一个 .i c源码文件和 .ii c++的。

cpp function.c > 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

以上是关于高级C和C++编译:无法编译书中提到的示例程序。的主要内容,如果未能解决你的问题,请参考以下文章

c语言和c++和c#的区别

linux程序编译过程

C++与C的区别终于说清楚了!

VSCode编写C++后不能编译运行

C ++程序无法编译[重复]

Linux 程序编译过程的来龙去脉