4.3.5 编译器gcc(2)
下面通过一个具体的例子来介绍vi编辑器和gcc编译器的使用。
例:新建一个hello.c,并用gcc编译、执行,步骤如下。
(1) 在当前目录下的终端命令行输入以下命令:
- $vi hello.c
即可进入vi空文档编辑界面,此时文档的名称为hello.c。
(2) 按键盘上的"i"键,进入编辑代码状态,这个时候输入以下程序。
- #include <stdio.h>
- int main(void)
- {
- printf("\nHello,ARM!\n");
- return 0;
- }
(3) 输入完成之后,由于当前处于编辑状态,可以按"ESC"键进入命令行模式。在命令行模式下按住Shift+":"组合键进入底行模式。这时编辑器左下角有冒号":"提示符,就可以输入命令了。输入下面命令存盘退出。
- :wq
(4) 返回终端命令行界面,利用gcc进入编译和链接,输入命令
- $gcc hello.c -o hello
就可以生成hello可执行文件了。
(5) 执行程序,终端输入下面命令,观察输出结果,如图4-4所示。
- $./hello
|
| (点击查看大图)图4-4 hello程序的执行结果 |
3. 编译多个源文件
有时候一个源程序可以分成几个文件。这样既便于编辑,又便于理解,尤其是程序非常大的时候。这也使对各部分独立编译成为可能。
下面的例子中我们将程序Hello ARM分割成三个文件:main.c、hello_fn.c和头文件hello.h。在先前的例子"hello.c"中,我们调用的是库函数printf,本例中我们用一个定义在文件"hello_fn.c"中的函数hello取代它。
下面是主程序"main.c":
- #include "hello.h"
- main(void)
- {
- hello("Embedded Linux");
- return 0;
- }
主程序中包含有头文件"hello.h",该头文件包含函数hello的声明。我们不需要在"main.c"文件中包含系统头文件"stdio.h"来声明函数printf,因为"main.c"没有直接调用printf。
文件"hello.h"中的声明只用了一行就指定了函数hello的原型。
- void hello(const char * name)
函数hello的定义在文件"hello_fn.c"中:
- #include <stdio.h>
- #include "hello.h"
- void hello (const char * name)
- {
- printf ("Hello,%s!\n",name);
- }
这里需要注意一点:语句"#include "FILE.h""与"#include <FILE.h>"是有区别的:前者在搜索系统头文件目录之前将先在当前目录中搜索文件"FILE.h",后者只搜索系统头文件而不查看当前目录。
下面开始编译过程,这里gcc需要同时编译多个文件,所以使用下面的命令:
- $ gcc -Wall main.c hello_fn.c -o newhello
本例中,我们使用选项-o为可执行文件指定了一个不同的名字newhello。注意到头文件"hello.h"并未在命令行中指定。源文件中的"#include "hello.h""指示符使得编译器自动将其包含到合适的位置。
要运行本程序,输入可执行文件的路径名:
- $ ./newhello
- Hello,Embedded Linux!
源程序各部分被编译为单一的可执行文件,它与我们先前的例子产生的结果相同。