搜索内容

  • 主页
  • 未分类
  • 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>
    它包含targetdependencycommand三个部分。具体如下所示:
    一个目标(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
    实验Makefilehelloworld
    一.实验目的
    1)熟悉Linux开发环境
    2)学习嵌入式开发的基本过程
    3)了解makefile下的程序编译与交叉编译过程
    二.基础知识
    1C语言基础知识
    2)掌握Linux环境下vi编译器的使用方法
    3)掌握Linux下的程序编译与交叉编译过程。
    三.实验环境
    为了完成本实验,以下硬件条件 是必须的:
    (1)      
    UP-NETARM2410-S嵌入式实验平台
    (2)      
    PCPentium500以上,硬盘40GB以上,内存128MB以上
    为了完成本实验,以下软件条件是必须的:
    (3)          
    PC机操作系统RedHat Linux 9.0
    (4)          
    ARM-Linux开发环境。
    四.情景描述
    创建一个新目录,并在其中编写hello.cMakefile文件。之后将已经编译好的文件下载到目标开发板上运行。
    五.完成实验所需时间:约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! 。恭喜你!你已经成功了。

    转载于:https://blog.51cto.com/chenboqiang/287194

    THE END
    < <上一篇
    下一篇>>