Ani*_*Ani 1 c c++ linux gcc compiler-errors
我正在阅读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);
Run Code Online (Sandbox Code Playgroud)
清单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;
}
Run Code Online (Sandbox Code Playgroud)
清单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;
}
Run Code Online (Sandbox Code Playgroud)
演示项目预处理示例:
gcc编译器提供的模式只对输入源文件执行预处理阶段:
gcc -i <input file> -o <output preprocessed file>.i
Run Code Online (Sandbox Code Playgroud)
除非另有说明,否则预处理器的输出是与输入文件同名且文件扩展名为的文件.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;
}
Run Code Online (Sandbox Code Playgroud)
如果将少量额外标志传递给gcc,则可以获得更紧凑和更有意义的预处理器输出
gcc -E -P -i <input file> -o <output preprocessed file>.i
Run Code Online (Sandbox Code Playgroud)
这导致了清单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;
}
Run Code Online (Sandbox Code Playgroud)
显然,预处理器替换了符号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
Run Code Online (Sandbox Code Playgroud)
如何摆脱这种情况并继续学习课程?请建议.