博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux C程序设计
阅读量:5734 次
发布时间:2019-06-18

本文共 3473 字,大约阅读时间需要 11 分钟。

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
开发环境中得到广泛应用,已经成为一种工程方面的编译方法。
 
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
嵌入式实验平台
(2)
        PC
Pentium500
以上,硬盘40GB
以上,内存128MB
以上
为了完成本实验,以下软件条件是必须的:
(3)
            PC
机操作系统RedHat Linux 9.0
(4)
            ARM-Linux
开发环境。
四.情景描述
创建一个新目录,并在其中编写hello.c
Makefile
文件。之后将已经编译好的文件下载到目标开发板上运行。
五.完成实验所需时间:约60
分钟
.
完成一个简单程序的编译过程
<
>
编写helloworld
程序
(1)
       
进入vim
编译器:
#vim hello.c
(2)
输入如下代码:
#include <stdio.h>  /*
定义头文件*/
int main() /*
定义主函数*/
{
Printf(“hello world.!\n”);  /*
输出hello world! .
换行*/
return 0;  /*
成功返回零*/
}
(3)
完成代码的编写之后,按住ESC
键之后,输入:wq
保存退出。
<
>
编写Makefile
(1)
       
新建  Makefile
文件
(2)
       
输入Makefile
文件代码,其中几个变量的说明如下:
(3)
        CC     
指明编译器
(4)
        EXEC       
表示编译后生成的执行文件名称
(5)
        OBJS        
目标文件列表
(6)
        CFLAGS   
编译参数
(7)
        LDFLAGS        
连接参数
(8)
        all:            
编译主入口
(9)
        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
中建立开发板与宿主机之间 
的通信
[root@EmbedSky /]# mount -t nfs -o nolock 192.168.1.10:/arm2410s /host
(2)
运行程序
 
 
 
呵呵,如果看到在超级终端输出hello world! 。恭喜你!你已经成功了。
本文转自 chen138 51CTO博客,原文链接:http://blog.51cto.com/chenboqiang/287194,如需转载请自行联系原作者
你可能感兴趣的文章
18 已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果
查看>>
BZOJ - 3578: GTY的人类基因组计划2
查看>>
理解WebKit和Chromium(电子书)
查看>>
爱——无题
查看>>
分布式服务框架原来与实践 读书笔记一
查看>>
Aho-Corasick automation-KMP
查看>>
【http】post和get请求的区别
查看>>
/etc/profile
查看>>
摘记总结(1)
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
编写who命令
查看>>
2.1 sikuli 中编程运行
查看>>
愚公移山第一章伪代码
查看>>
常见的位运算技巧总结(膜wys)
查看>>
python魔法函数(二)之__getitem__、__len__、__iter__
查看>>
EL表达式无法显示Model中的数据
查看>>
Linux应用小技巧
查看>>
考题纠错2
查看>>
ps6-工具的基础使用
查看>>
关于CefSharp.WinForms的学习
查看>>