Advanced C and C++ compiling: unable to compile the example program mentioned in the book
我正在阅读Milan Stevanovic撰写的名为"高级C和C ++编译"的书
以下是本书的快照,其次是我面临的问题。
概念图:演示项目
用于构建此简单项目的开发环境将基于运行的gcc编译器
Linux操作系统。清单2-1到2-3包含演示项目中使用的代码。
清单2-1。
1 2 3 4 5 6 7 8 9 | #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。
1 2 3 4 5 6 7 8 9 10 11 12 | 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。
1 2 3 4 5 6 7 8 9 10 11 | #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编译器提供的模式只对输入源文件执行预处理阶段:
1 | gcc -i <input file> -o <output preprocessed file>.i |
除非另有说明,否则预处理器的输出是与输入文件同名的文件
其文件扩展名为
清单2-4。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 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,则可以获得更紧凑和更有意义的预处理器输出
1 | gcc -E -P -i <input file> -o <output preprocessed file>.i |
这导致了清单2-5中所示的预处理文件。
清单2-5
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } |
显然,预处理器根据事实来替换符号
问题:
当我使用gcc编译程序时,以下是我面临的错误
来自终端的快照。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
如何摆脱这种情况并继续学习课程?
请建议。
我是这本书的技术评论员,作者让我代表他发布这个解释:
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).
试试这个
1 | gcc -E -P function.c -o function.i |
没有
注意:这个答案在我意识到误解了这个问题之后得到了解决,所以我修复了保留它而不是删除它,但凯蒂确实在我做之前回答了它。
请尝试以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 |