高级C和C++编译:无法编译书中提到的示例程序
Advanced C and C++ compiling: unable to compile the example program mentioned in the book
我正在读一本名为 "Advanced C and C++ compiling" 的书,作者是 Milan Stevanovic
以下是书中的快照,后面是我面临的问题。
概念图:演示项目
用于构建这个简单项目的开发环境将基于 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
(精简版)
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
如何摆脱这个问题并继续学习课程?
请建议。
试试这个
gcc -E -P function.c -o function.i
没有 -i
选项,它不是 gcc
选项。
注意:这个答案是在我意识到误解了这个问题后修复的,所以我决定保留它而不是删除它,但是Katie 确实比我先回答了。
-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
我是这本书的技术审稿人,作者让我代表他post解释一下:
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).
从本书示例中的 .i
输出文件来看,错误似乎出在实用程序本身。
不使用 gcc
,而是使用 cpp
。 gcc 在后台使用 cpp(C 预处理器)来处理宏扩展和 header 包含。 cpp 的输出是 .i
c 源代码文件和 .ii
c++ 文件。
cpp function.c > function.i
我正在读一本名为 "Advanced C and C++ compiling" 的书,作者是 Milan Stevanovic
以下是书中的快照,后面是我面临的问题。
概念图:演示项目
用于构建这个简单项目的开发环境将基于 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
(精简版)
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
如何摆脱这个问题并继续学习课程? 请建议。
试试这个
gcc -E -P function.c -o function.i
没有 -i
选项,它不是 gcc
选项。
注意:这个答案是在我意识到误解了这个问题后修复的,所以我决定保留它而不是删除它,但是Katie 确实比我先回答了。
-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
我是这本书的技术审稿人,作者让我代表他post解释一下:
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).
从本书示例中的 .i
输出文件来看,错误似乎出在实用程序本身。
不使用 gcc
,而是使用 cpp
。 gcc 在后台使用 cpp(C 预处理器)来处理宏扩展和 header 包含。 cpp 的输出是 .i
c 源代码文件和 .ii
c++ 文件。
cpp function.c > function.i