高级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++编译:无法编译书中提到的示例程序。的主要内容,如果未能解决你的问题,请参考以下文章