Linux C程序设计
C语言和Linux操作系统之间的关系非常密切。早在1977年,贝尔实验室的Dennis Ritchie就为了辅助开发UNIX而发表了不依赖与具体机器系统的C语言编译文本,即著名的ANSI C 从那时候起,C就成为世界上使用最广泛计算机语言。
在LINUX下,一般使用GNU C编译器(GCC)进行应用程序的编译。该编译器建立在自由软件基金会编译许可证的基础上,可以自由发布。GNU C编译器(GCC)是一款功能强大的ANSI C兼容编译器,一般存放在/usr/bin目录下;其头文件一般存放在/usr/include及其下级子目录里;而标准的库文件则存在/lib或/usr/lib目录下里。Gcc命令的基本用法如下所示:
Gcc [option] [filename]
Make是一个命令工具,它读入Makefile的指令并按照其制定的规则执行。Makefile文件中描述整个工程所有文件的编译顺序、编译规则,并且拥有自己的书写格式、关键字和函数;而且在Makefile中可以使用系统shell所提供的任何命令来完成想要的工作,因此能够大大提高编译程序的效率。通过其自动化编译的规则,只需要一个make命令,整个工程就可以自动完成全部编译工作,因此在IDE开发环境中得到广泛应用,已经成为一种工程方面的编译方法。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Makefile介绍
默认情况下,GNU make工具在当前工作目录中按如下顺序搜索makefile:
GNUmakefileàmakefileàMakefile
虽然Makefile作为规则的优先等级较低,不过由于Makefile的首字母大写,因此在当前目录下会优先显示,所以程序员往往会采用Makefile作为makefile 文件。如果要使用其他文件作为makefile,则可采用以下方式:
$make-f Makefile debug
Makefile的基本结构如下:
Target:dependency dependency
(tar) <command>
它包含target、dependency和command三个部分。具体如下所示:
一个目标(target):最终需要创建的文件,包括可执行文件或者目标驱动文件等。当然目标也可以是需要执行的动作,如:“clean”等。
一个或多个依赖文件(dependency):在创建target是需要用到的文件列表。
一系列命令(command):make执行的动作,即创建target时需要执行的步骤。通常是把制定文件编译成目标文件的编译命令,每个命令占一行,且每个命令的起始字符必须为TAB字符。
编译的具体过程是:make工具首先读取makefile中的规则,然后检查该规则中的依赖文件与目标文件的时间截哪个更新一些,并根据规则链由下至上依次编译过程,直到最终的可执行文件被重新连接完成为止。
Makefile 中的变量
Makefile里的变量类似一个环境变量。这些变量对大小写敏感,一般使用大写字母。
下面给出一个集体的makefile:
OBJS=prog.o code.o # 定义变量OBJS
CC=gcc #定义变量CC
Test:$(OBJS)
$(CC) –O test $(OBJS) #gcc –o test prog.o code.o
Prog.o:prog.c prog.h prog.o
Code.o:code.c code.h
Clean:
Rm –f *.o *.elf *.gdb
实验Makefile与helloworld
一.实验目的
(1)熟悉Linux开发环境
(2)学习嵌入式开发的基本过程
(3)了解makefile下的程序编译与交叉编译过程
二.基础知识
(1)C语言基础知识
(2)掌握Linux环境下vi编译器的使用方法
(3)掌握Linux下的程序编译与交叉编译过程。
三.实验环境
为了完成本实验,以下硬件条件 是必须的:
(1)
UP-NETARM2410-S嵌入式实验平台
UP-NETARM2410-S嵌入式实验平台
(2)
PC机Pentium500以上,硬盘40GB以上,内存128MB以上
PC机Pentium500以上,硬盘40GB以上,内存128MB以上
为了完成本实验,以下软件条件是必须的:
(3)
PC机操作系统RedHat Linux 9.0
PC机操作系统RedHat Linux 9.0
(4)
ARM-Linux开发环境。
ARM-Linux开发环境。
四.情景描述
创建一个新目录,并在其中编写hello.c和Makefile文件。之后将已经编译好的文件下载到目标开发板上运行。
五.完成实验所需时间:约60分钟
六.完成一个简单程序的编译过程
<一>编写helloworld程序
(1)
进入vim编译器:
进入vim编译器:
#vim hello.c
(2)输入如下代码:
#include <stdio.h> /*定义头文件*/
int main() /*定义主函数*/
{
Printf(“hello world.!\n”); /*输出hello world! .换行*/
return 0; /*成功返回零*/
}

(3)完成代码的编写之后,按住ESC键之后,输入:wq保存退出。
<二>编写Makefile
(1)
新建 Makefile文件
新建 Makefile文件
(2)
输入Makefile文件代码,其中几个变量的说明如下:
输入Makefile文件代码,其中几个变量的说明如下:
(3)
CC 指明编译器
CC 指明编译器
(4)
EXEC 表示编译后生成的执行文件名称
EXEC 表示编译后生成的执行文件名称
(5)
OBJS 目标文件列表
OBJS 目标文件列表
(6)
CFLAGS 编译参数
CFLAGS 编译参数
(7)
LDFLAGS 连接参数
LDFLAGS 连接参数
(8)
all: 编译主入口
all: 编译主入口
(9)
clean: 清除编译结果
clean: 清除编译结果
#vim Makefile
CC=armv4l-unknown-linux-gcc /*定义armv4l-unkown-linux-gcc交叉编译器,这个armv4l-unknown-linux-gcc也可以用gcc代替,编译后在linux中运行hello执行程序,也可以输出hello world!*/
EXEC=hello /*执行文件名为hello*/
OBJS=hello.o /*目标文件为hello.o*/
CFLAGS+= /*编译参数*/
LDFLAGS+=-static /*连接参数*/
all:$(EXEC) /*编译主入口,表示编译所以的内容,是执行make默认的目标*/
$(EXEC):$(OBJS) /*执行文件,到目标文件*/
$(CC) $(LDFLAGS) -o $@ $(OBJS) /*armv4l-unknown-linux-gcc-static –o hello hello.o */
clean: /*清除所有的生成的执行文件,*.elf *.o *.gdb*/
-rm -f $(EXEC) *.elf *.o *.gdb

注意:“ $(CC) $(LDFLAGS) –o $@ $(OBJS)”和“-rm –f $(EXEC) *.elf *.o *.gdb”前前的空白由一个Tab制表符生成。
<三>编译应用程序
(1)
使用如下操作:
使用如下操作:
[root@localhost arm2410s]#make clean
rm –f hello *.elf *.o *.gdb
[root@localhost arm2410s]#make
armv4l-unknown-linux-gcc -c -o hello.o hello.c
armv4l-unknow-linux-gcc-static –o hello hello.o
[root@localhost arm2410s]#ls
Hello hello.c hello.o Makefile

<四>下载调试
(1)
在宿主机上启动NFS服务,并设置好共享的目录。之后进入minicom中建立开发板与宿主机之间 的通信
在宿主机上启动NFS服务,并设置好共享的目录。之后进入minicom中建立开发板与宿主机之间 的通信
[root@EmbedSky /]# mount -t nfs -o nolock 192.168.1.10:/arm2410s /host
(2)运行程序
呵呵,如果看到在超级终端输出hello world! 。恭喜你!你已经成功了。
转载于:https://blog.51cto.com/chenboqiang/287194