2017-04-03 13:31:12 yz764127031 阅读数 652
  • 嵌入式Linux多任务编程

    本课程主要讲解Linux环境进程与线程的概述,进程创建,进程间通信编程,多线程编程。 学习条件: 1.C编程基础 2.Linux编程基础

    8612 人正在学习 去看看 沈寒

个人笔记
一个IDE通常提供编辑,编译,链接,工程管理,调试等功能。
而在使用Linux进行C/C++编程中,这些功能是由vim,gcc,make,gdb四个软件提供支持(也有其他变种)。
使用Linux环境的优势一方面在于自由,给开发者进行私人订制的空间,另一方面也是要求使用者对自己的程序负责任,了解程序细节,而不是全部交给IDE负责。
vim
基本使用是掌握模式切换,复制粘贴,光标移动和跳转,查找字符串。
进阶的使用是知道vim配置文件,并可以进行编辑格式设置。
例如:

vim  ~/.vimrc
set shiftwidth=2 #设置缩进宽度为2个空格
set tabstop=2    #设置tab键宽度为2个空格
set number       #显示行号

也可以下载插件,来实现更加复杂的自动补全等编辑功能。

gcc
gcc负责生成可执行文件的编译工具,有几个部分组成,如as,dl1等。
基本使用是掌握生成可执行文件和中间文件(汇编,目标)编译的命令。
进阶的使用是掌握静态链接,动态链接相关的知识。
推荐参考书《程序员的自我修养》

make
make是一种工程管理的工具,即编程时可能需要多个文件编译生成可执行文件,make就是通过制定整个工程中各个部分的编译顺序来对整个工程管理。
makefile支持变量,模式匹配等。

gdb
Linux配套的调试工具,使用需要编译时gcc -g参数。
gdb filename进入调试
list1从第一行列出代码,点击回车,显示下一段
b +行号 设置断点
display 变量 显示变量值
run 运行程序

一点简单介绍和总结,详细内容需要找其他参考资料

2017-07-17 17:24:30 dcy15244 阅读数 158
  • 嵌入式Linux多任务编程

    本课程主要讲解Linux环境进程与线程的概述,进程创建,进程间通信编程,多线程编程。 学习条件: 1.C编程基础 2.Linux编程基础

    8612 人正在学习 去看看 沈寒

Linux 编程环境


1.编辑器 vi

(1)编辑器 vi 简介
    编辑器 vi 最初是由 Sun Microsystrms 公司的 Bill Joy 在1976 年开发的。启初,开发出了 Ex 编辑器,也称为行编辑器,后来开发了vi作为Ex的可视接口,一次能看到一屏的文本而不仅仅是一行,vi因此得名。vi在通过命令操作,界面不友好,对普通人不容易掌握。但是,其丰富的命令和强大的功能,以及占用资源少的特性,使得它在嵌入式Linux系统中,广泛使用。

(2)vi用法
    vi有三种模式:
        插入模式:  写代码
        可视模式:  复制、粘贴、删除、查找等
        
2.编译器 gcc

(1)编译器 gcc 简介  
    Linux系统下的 gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,它是GNU的代表作品之一,gcc是可以在多种硬件平台上编译出可执行文件的超级编译器,其执行效率比一般的编译器要高出20%-30%。编译器能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件如果没有给出可执行文件的名字,gcc将生成一个默认名为a.out的可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件,而gcc则通过后缀来区别输入文件的类型。                                 

自己查找:
    GNU :是一个自由软件工程项目,对unix向上兼容的完整的自由软件系统
    GPL (General Public License):是GNU的通用公共许可证,同其它的自由软件许可证一样,许多社会公众享有:运行、复制软件的自由,发现传播软件的自由,获得软件原码的自由。

    GPIO:微控制芯片上的一个通用可编程io接口

(2)gcc 的编译过程
    源文件(.c .h)-> 预处理->编译->汇编->(静态库,动态库)链接->可执行文件

预处理(Preprocessing):

    主要处理源文件中,以'#'开头的语句,如#include  #ifdef  #define等,该阶段会产生一个中间文件 (*.i)。
    命令 gcc -E -o zmx.i zmx.c。(通常是程序警告)

编译阶段(Compilation):
    
    预处理完成后,gcc首先检查代码的规范性,以及是否有语法错误等。检查无误后,开始把代码翻译成汇编语言。
    命令:gcc -S -o zmx.s zmx.c

汇编阶段(Assembly):

    在汇编阶段,将输入的汇编文件 *.s,转换成目标文件 *.o, *.o 已经是二进制文件,即 0 和 1的机器语言,但是,它不是可执行的二进制文件。
    命令:gcc -c -o zmx.o zmx.c

链接阶段(Linking):-o

    汇编之后,进入链接。在链接阶段,通过链接各种静态库和动态库,得到可执行文件。
    命令:gcc -o star zmx.c

(3)gcc 常见的用法

    gcc -c    
    gcc -E    
    gcc -S    
    gcc -o    生成指定的输出文件
    gcc -v    查询gcc版本信息
    gcc -g    生成调试信息,gdb调试器可以利用该信息
    gcc -I    指定额外的头文件搜索路径
    gcc -L    指定额外的函数库搜索路径
    gcc -static    静态链接库,默认都是动态链接库
    gcc -w        不生成任何警告信息
    gcc -Wall    生成所有警告信息


    gcc -c zmx.c -o zmx
    gcc -o zmx zmx.c
    gcc zmx.c -g -o zzz
    

---------------------------------------------------------------------------

模块化编程:     

     例子:写一个四不像软件。

            1.写一个判断月份的程序
            2.写一个比较两个数大小的程序
            3.写一个随机数的程序
            4.写一个hello world程序
    架构:
             将每个模块写一个.c文件,文件不存在main(),将函数的声明写在.h文件里。
                   写一个main程序,包含各模块的功能。
     ----------------------------------------------------
           例如:第1步:编写 month.c
            #include <stdio.h>
            
            void month()
            {
               //业务逻辑代码
            }
                第2步:编写 month.h
            void month();

                第3步:编写 compare.c
            #include <stdio.h>
            
            void compare()
            {
                //业务逻辑代码
            }
                第4步:编写 compare.h
            void compare();
                第5步:编写 syso.c
            #include <stdio.h>

            void syso()
            {
                //业务逻辑代码
            }
                第6步:编写 syso.h
            void syso();
                第7步:编写 main.c
            #include <stdio.h>
            #include "month.h"
            #include "compare.h"
            #include "syso.h"
            
            void main()
            {
                printf("开始演示本程序!\n");
                month();
                compare();
                syso();
            
            
            }
                第8步:编写makefile
                second:    main.o compare.o syso.o month.o
                gcc -o second main.o month.o compare.o syso.o
                main.o: main.c
                gcc -c -o main.o main.c
                compare.o:compare.c
                gcc -c -o compare.o compare.c
                syso.o: syso.c
                gcc -c -o syso.o syso.c
                month.o: month.c
                gcc -c -o month.o month.c
                clean:
                rm -rf *.o second

                第9步:输入"make"命令,创建可执行程序 second
                第10步:输入"./second"执行程序
            (也可以不写Makefile,直接将每个模块的.c文件生成.o文件,然后将.o和.h文件与main.c文件整合.再用gcc -o second main.o month.o compare.o syso.o 生成了  可执行文件second,再./second执行即可。这种多次修改就比较繁琐!)


3.调试器 gdb
 
                    使用gdb: 1.生成gdb调试信息文件(gcc 源文件 -g -o 新文件名)
                                     2.直接进入:gdb 文件名  或者:gdb --->file 文件名
                            
(1)调试器 gdb 简介
    gdb是Linux系统上缺省(可装可不装的)使用的调试器。gdb也可以被移植到不同的平台上,如ARM系列处理器的调试器

(2)gdb 用法
    1.进入gdb调试环境,有两种方式。
    (1)在shell终端,直接输入 gdb ,会看到gdb的一些版本信息;然后使用file 命令调试可执行程序。  file star  (star 为需要调试的可执行程序)
    (2)在终端直接输入 gdb star.
     gdb 文件名
    2.gdb 的常用命令:

命令    简写    格式            含义

(C)file        file 文件名        加载文件
display        display 变量名        显示参数(设置监听变量)
 (D)run    r    run args        运行程序
list    l    list [开始,结束]     列出文件的代码清单
print    p    print 变量名        打印变量的内容
break    b    break [行号或函数名]    设置断点
continue c    continue [开始,结束]    继续运行
info    i    info 变量名        列出信息
next    n    next            下一行
step    S    step            进入函数(步入)

r----》s单步

quit    q    退出

delete        删除断点 (断点参数是第几个,加数字)
disable        禁用断点  
enable        恢复禁用的断点

4.make 和 Makefile

(1)make 和 Makefile 概述
    make 是一个命令,用来解析Makefile文件;
    Makefile 是一个文件,用来告诉 make 命令如何编译整个工程,生成可执行文件。

(2)make 命令
    make [选项]  [Makefile 文件]

make 执行的流程:

    1. 查找当前目录下的 Makefile 文件;
    2. 初始化 Makefile 文件中的变量;
    3. 分析 Makefile 中的所有规则;
    4. 为所有的文件创建依赖关系;
    5. 根据依赖关系,决定哪些目标文件要重新生成;
    6. 执行生成命令。

(3)Makefile 文件内容

    1. 规则
    (1)Makefile 是由规则来实现的: 目标  依赖   命令

    (2)Makefile 的格式:

            目标:  依赖
            <Tab>    命令
        目标和依赖之间,通过“:”分隔,命令前面,是由“Tab”键产生的空格。

        当 make 命令去执行 Makefile 文件时,其规则被这样处理:
        
    ·目标是文件,依赖也是文件。若依赖文件的时间,比目标文件的时间新,说明依赖文件被更新了。则运行规则包含的命令,产生新的目标文件。

    ·如果依赖的是另一条规则的目标,则先跳到另一条规则去执行命令,再返回当前规则。
    ·如果目标不是一个存在的文件,则一定执行。(目标不存在,必须执行)


    2. 变量

    (1)变量的基础
    (2)变量中的变量
    (3)变量的高级用法
    (4)追加变量值
    (5)环境变量
    (6)特殊(内部)变量


5.Linux 编程库
    在后面课程补充(驱动部分)

6.shell 脚本编程
    (1)建立和运行shell脚本
    (2)shell 中的变量
        1.用户自定义变量
        2.位置变量
        3.环境变量

    (3)shell 中的test命令
        1.字符串比较
        2.数值比较
        3.文件比较
    
    (4)shell中的流程控制语句
        1.条件语句(if)
        2.循环语句(for  、while 、 unit)

    (5)shell 程序中的函数
        1.函数定义格式
        2.函数调用格式



2010-09-15 18:23:00 aijiekj 阅读数 702
  • 嵌入式Linux多任务编程

    本课程主要讲解Linux环境进程与线程的概述,进程创建,进程间通信编程,多线程编程。 学习条件: 1.C编程基础 2.Linux编程基础

    8612 人正在学习 去看看 沈寒

Linux编程环境搭建

对于一个经常在Linux下工作的程序员来说搭建一个好的工作环境是我们有一个好的工作效率的基础。这里以Ubuntu 10.04为例,在这里给大家总结一下,有不对的地方或者不全的地方希望大家提出,能让这篇文章更全。
在安装一个这个系统后,有许多地方是需要我们自己来设置的,刚装系统后,系统会为我们的root用户设置一个默认密码对于这个来说,如果我们用到纯超级用户登录系统时是非常不方便的,所以我们先要把root用户的密码修改一下,修改方法如下:
sudo passwd root
这时系统会让我会输入管理员的密码,这时我们只要输入当前用户的密码就可以,然后再输入我们要设置的root用户的密码,最后再确认一次就可以了。这样做对我们后面的操作是非常重要的。
对于一个程序员来说一个好编辑器是非常重要的,对于Linux来说它默认会给我们安装一个vi编辑器这个编辑器不能直接设置我们的键盘操作起来非常困难,这时我们就可以使用它的的一个升级版本vim编辑器,它的安装方法全配置方法如下:
安装方法:
sudo apt-get install vim
这时系统让我们输入超级用户密码我们只要输入刚才设置好的密码就可以了。这个是需要在线安装的,所以我们要先把我们的网络设置好确保它能正常上网。
等安装成功后,对我们来说这个是不够的,我们还需要把它的环境配置文件修改一下真样才能用起来会更方便,设置方法如下:
cd  //回到当前用户的主目录
vim .vimrc //新建一个vim编辑器的环境配置文件
.vimrc文件的内容如下:

//设置字符编码格式,这样它就能直接识别windows个的字符编码了,这里是两种方法,对于第一种方法,我把它注掉了,到时候我们可以选择其中一种就可以了,我有一个系统只能用上的方法,但是我的另一个系统就可以使用下面的方法,到时候我们可以随机应变
"Encoding settings
"set enc=utf-8
"set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
if has("multi_byte")
 set encoding=utf-8
 set fileencoding=chinese
 set fileencodings=ucs-bom,utf-8,chinese
endif

"Language Settings
"set langmenu=zh_CN.UTF-8
"set helplang=cn

//显示行号
"set the number
set nu

//自动缩进
"set auto indent
set autoindent
set cindent

//缩进4个字符
"set the tab key width
set tabstop=4

"Can use the mouse anywhere buffer
"set mouse=a
"set selection=exclusive
"set selectmode=mouse,key

"unified indent 4 width
set softtabstop=4
set shiftwidth=4

"Do not use spaces instead fo tabs
set noexpandtab

"The beginnig of the line and use tab section
set smarttab

//历史记录设置成1000
"history 
set history=1000

//不产生成临时文件
"marked only generate temporary files
set nobackup
set noswapfile

//使用tags标签
"set ctags tags
set tags=/usr/include/tags "must be has the tags file(ctags -R use root create)

如果我们直接把上面的代码拷到.vimrc文件中可能会出错,最后的tags标签是使用ctags工具生成的tags标签后才再到配置文件中去就,这是为了让我们能够方便查找一些结构体和数据类型而加上去它的安装方法如下:
su -   //切换到超级用户这种方法可以只使用超级用户的环境变量设置
cd /usr/include  //这是为下面生成tags文件做的准备,
apt-get install ctags //安装ctags软件包
ctags -R  //生成tags文件,可能会生成tag文件这时,我们要先删除它,再执行一次此命令,这时就会生成tags文件了,我们可以使用ls tags 命令来查看生成的结果
这时就该有人问如果使用这个标签了,我们可以这样做,对于一些不太清楚的数据类型我们可以定位它的上面然后按“Ctrl+]”组合键,这些它就会自动跳转到它定义位置,如果不只一个文件中存在的话它会给我们罗列出来到时候我们只要选择相应的序号好按回车就可以了,当我们查看完成后我们就可以使用“Ctrl+T”组合键跳回到我们编辑位置。
对于编写大程序来说,我们需要使用Makefile来管理,刚装的系统中只有make而于automake、autoconf这些工具是没有的,这时是需要我们来手动安装的,安装方法如下:
sudo apt-get install automake
sudo apt-get install autoconf
需要提醒的是如果我们要是让它自动生成Makefile文件的话,如果是按照步骤一步步来进行的话是可以生成Makefile文件的,但是对于一些二进制软件包不知道为什么就是不能生成Makefile文件不知是软件包的原因还是环境的原因,如果有人知道,能给我回个帖字吗?
如果要进行图形化编程的话,它好像需要ncurses库,对于线程的话pthread库好像也是不全的,对于这些我的安装不太好,我是直接使用的新立得软件包管理器来安装的,直接在搜索栏中输入的要安装的库,但是不确定要安装那一个就我就随便选择了几个安装上了,我知道这种方法是不分健全的可以会缺许多包的,如果有人知道如果补上这些包的话,请发帖字告诉我让大家互相交流一下。
我知道的就是这些了,总结了一下和大家一起分享,如果谁知道一些其他需要安装的工具也希望你能发帖告诉我和大家一起分享!提前谢谢你们了!!!!

2011-04-10 00:10:00 tigernorth 阅读数 747
  • 嵌入式Linux多任务编程

    本课程主要讲解Linux环境进程与线程的概述,进程创建,进程间通信编程,多线程编程。 学习条件: 1.C编程基础 2.Linux编程基础

    8612 人正在学习 去看看 沈寒

     第四章Linux编程环境相对比较简单,这一章介绍了与Linux编程开发中的一些相关知识。包括编程参数、环境变量、时间日期、临时文件、用户信息、日志与资源限制。

      编程参数

      编程参数上一章有做了简单的介绍,通过void main(int argc, char *argv[ ]) 来调用参数。对于比较简单的参数,我们可以简单通过数组argv[ ]来调用,如果是需要有选项功能,系统提供getopt()函数给我们进一步分析处理选项。

int getopt(int argc, char *const argv[], const char *optstring);

    argc跟argv是main里面的参数,而optstring则是用来定义选项的,例如:getopt(argc, argv, "if:lr"),optstring定义的是允使用的选项,后面带有冒号(:)表明该选项后面需要带参数。

    就如平常使用编译文件的命令: $ gcc -o bin/test test.c,明显选项o是一定要使用参数的,不然系统不知道把编译之后的结果存放在什么地方。要注意的是,使用了getopt()做了一次循环扫描之后,参数的顺序是会发生改变的。例如gcc test.c -o bin/test,执行完扫描之后argv[ ]参数的顺序变成了  gcc -o bin/test test.c,也即是说,optget()会把没有选项的参数都放到argv[ ]的最后面。

      环境变量

      关于系统的环境变量,主要有两个处理函数分别是:

#include <stdlib.h>

char *getenv(const char *name);    取得某个环境变量的值,如getenv("HOME")

int putenv(const char *string);         把一个形如"name=value"的东西输入到环境变量里面。

      时间日期

      时间在计算机里面的存储是长整形,表示的是从1970年1月1日 00:00到所指示时间点所经过的秒数,因此,这个时间只能精确到秒。

#include <time.h>

time_t time(time_t *tloc);

    time函数可以获得当前计算机时间,这个函数可以通过参数也可以通过返回值来获取时间。即

the_time = time((time_t)NULL);

time(&the_time);

    这两个式子的作用是一样的,都可以获取当前时间。

    对于整形数,便于计算机处理,但对于人类,这个整数本身并没有带着太多我们可以理解的信息。所以需要进一步解析该整形数,变成人类易于理解的时间(包含年月日等信息)。

struct tm *gmtime(const time_t timeval);    //获取计算机时间

struct tm *localtime(const time_t timeval);  //获取当地时间

    tm里面有tm_sec,tm_min, tim_hour, tm_mon, tm_year, tm_mday, tm_wday, tm_yday, tm_isdst这些参数,通过这些参数就能调用一个时间的点的年月日以及时分秒等。

      临时文件

      临时文件的创建很简单,使用tmpfile()就行,在使用完改文件之后,系统会自动删除。

#include <stdio.h>

FILE *tmpfile(void);

    注意返回值是FILE类型,而不是int类型,所以创建后的文件只能用于标准文件处理函数(stdio.h),而不能用户低级文件处理函数(unistd.h)。

      用户信息

      在Linux中,用于存放用户信息的文件一般存放在/etc/passwd,该文件一般包括用户名,用户ID,用户组ID,用户HOME目录,用户shell启动程序等。例如下面就是passwd文件中的一条记录:

qitai:x:1002:1001:,,,:/home/qitai:/bin/bash

   同时/etc下面还有一个文件是用来存储用户组信息的,/etc/group,例如下面一条记录
qitai:x:1001:

    Linux中对用户信息查询处理其实就是对这两个文件的处理,有下面几个常用的函数。

#include <sys/types.h>

#include <unistd.h>

uid_t getuid(void);      //读取当前登录的用户ID

char *getlogin(void);    //读取当前登录用户名字

gid_t getgid(void);       //读取当前登录用户组ID

      系统日志

      说到系统日志,就得谈谈日志记录里面的记录优先级,也就是日志信息的紧急程度。根据程度的又深到浅可以分为下面八种情况:

LOG_EMERG       超级紧急

LOG_ALERT        紧急警报,例如数据库崩溃

LOG_CRIT           比较严重的错误,例如硬件错误

LOG_ERR            普通错误

LOG_WARNING    警告

LOG_NOTICE       注意

LOG_INFO            信息

LOG_DEBUG         调试信息

记录系统日志通过下面函数即可实现:

#include <syslog.h>

void syslog(int priority, const char *message, arguments......);

优先级有上面八种情况可以选择,后面的信息跟printf();的用法一样。

      资源管理

      系统的资源主要包括内存资源跟CPU资源,因为硬件本身有原因,所以资源会有所限制。而且操作系统为了维持整个系统的稳定,也不会毫无限制地让你使用系统资源,也即是说,系统资源需要一个比较有效的管理。程序对资源的管理主要有两个方面,一个是优先级管理,一个是资源利用限制。由于资源操作都比较繁琐,这里就不多加叙述,感兴趣的可以查看下面的文章http://pubs.opengroup.org/onlinepubs/007908799/xsh/sysresource.h.html

    这里介绍一个很有用的函数,是用来获取系统使用资源的。

#include <sys/resource.h>

int getrusage(int who, struct rusage *r_usage);

who是一个常量,有两个值:RUSAGE_SELF、RUSAGE_CHILDREN(当前进程,跟包括子进程)

r_usage有下面两个量:struct timeval ru_utime ,   struct timeval ru_stime。

    一个是程序执行的用户时间,一个是系统时间。用户时间是普通运算运行的时间,系统时间是程序进行系统调用时,切换到内核模式下,其所运行的时间。用户时间跟系统时间的具体区别,可参考https://engineering.purdue.edu/ECN/Support/KB/Docs/UserTimeVsSystemTime

      第四章总体来说比较简单,知识点比较零碎。上面只是提到一些我觉得比较重要和要注意的地方,说到不对的地方,还请大家多多指教。 

2017-07-19 23:31:31 W77_20 阅读数 333
  • 嵌入式Linux多任务编程

    本课程主要讲解Linux环境进程与线程的概述,进程创建,进程间通信编程,多线程编程。 学习条件: 1.C编程基础 2.Linux编程基础

    8612 人正在学习 去看看 沈寒
Linux 编程环境

1.编辑器 vi

(1)编辑器 vi 简介
编辑器 vi 最初是由 Sun Microsystrms 公司的 Bill Joy 在1976 年开发的。启初,开发出了 Ex 编辑器,也称为行编辑器,后来开发了vi作为Ex的可视接口,一次能看到一屏的文本而不仅仅是一行,vi因此得名。vi在通过命令操作,界面不友好,对普通人不容易掌握。但是,其丰富的命令和强大的功能,以及占用资源少的特性,使得它在嵌入式Linux系统中,广泛使用。

(2)vi用法
vi的三种模式:
插入模式:  写代码
可视模式:  复制、粘贴、删除、查找等
命令模式:

2.编译器 gcc

(1)编译器 gcc 简介  
Linux系统下的 gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,它是GNU的代表作品之一,gcc是可以在多种硬件平台上编译出可执行文件的超级编译器,其执行效率比一般的编译器要高出20%-30%。编译器能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件如果没有给出可执行文件的名字,gcc将生成一个默认名为a.out的可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件,而gcc则通过后缀来区别输入文件的类型。                                 

(2)gcc 的编译过程
源文件(.c .h)-> 预处理->编译->汇编->(静态库,动态库)链接->可执行文件

预处理(Preprocessing):
主要处理源文件中,以'#'开头的语句,如#include  #ifdef  #define等,该阶段会产生一个中间文件 (*.i)。
命令 gcc -E -o rand.i rand.c。

编译阶段(Compilation):
预处理完成后,gcc首先检查代码的规范性,以及是否有语法错误等。检查无误后,开始把代码翻译成汇编语言。
命令:gcc -S -o rand.s rand.i

汇编阶段(Assembly):
在汇编阶段,将输入的汇编文件 *.s,转换成目标文件 *.o, *.o 已经是二进制文件,即 0 和 1的机器语言,但是,它不是可执行的二进制文件。
命令:gcc -c -o rand.o rand.s

链接阶段(Linking):
汇编之后,进入链接。在链接阶段,通过链接各种静态库和动态库,得到可执行文件。
命令:gcc -o 577 zmx.o

(3)gcc 常见的用法
gcc -c
gcc -E
gcc -S
gcc -o 生成指定的输出文件
gcc -v 查询gcc版本信息
gcc -g 生成调试信息,gdb调试器可以利用该信息
gcc -I 指定额外的头文件搜索路径
gcc -L 指定额外的函数库搜索路径
gcc -static 静态链接库,默认都是动态链接库
gcc -w 不生成任何警告信息
gcc -Wall 生成所有警告信息

gcc -c rand.c -o 577
gcc -o 577 zmx.c
gcc zmx.c -g -o zzz

3.调试器 gdb

(1)调试器 gdb 简介
gdb是Linux系统上缺省使用的调试器。gdb也可以被移植到不同的平台上,如ARM系列处理器的调试器

(2)gdb 用法
1.进入gdb调试环境,有两种方式。
(1)在shell终端,直接输入 gdb ,会看到gdb的一些版本信息;然后使用file 命令调试可执行程序。  file 577  (577 为需要调试的可执行程序)
(2)在终端直接输入 gdb 577

2.gdb 的常用命令:

命令 简写 格式 含义


file file 文件名 加载文件
display display 变量名 显示参数(设置监听变量)
run r run args 运行程序
list l list [开始,结束] 列出文件的代码清单
print p print 变量名 打印变量的内容
break b break [行号或函数名] 设置断点
continue c continue [开始,结束] 继续运行
info i info 变量名 列出信息
next n next 下一行
step S step 进入函数(步入)
quit q 退出
delete delete nu 删除断点      delete  nu   (nu 表示第几个断点,而不是第几行的断点)
disable disable nu 禁用断点
enable enable nu 恢复禁用的断点


4.make 和 Makefile

(1)make 和 Makefile 概述
make 是一个命令,用来解析Makefile文件;
Makefile 是一个文件,用来告诉 make 命令如何编译整个工程,生成可执行文件。

(2)make 命令
make [选项]  [Makefile 文件]

make 执行的流程:

1. 查找当前目录下的 Makefile 文件;
2. 初始化 Makefile 文件中的变量;
3. 分析 Makefile 中的所有规则;
4. 为所有的文件创建依赖关系;
5. 根据依赖关系,决定哪些目标文件要重新生成;
6. 执行生成命令。

(3)Makefile 文件内容

1. 规则
(1)Makefile 是由规则来实现的: 目标  依赖   命令

(2)Makefile 的格式:

目标:  依赖
<Tab> 命令
目标和依赖之间,通过“:”分隔,命令前面,是由“Tab”键产生的空格。

当 make 命令去执行 Makefile 文件时,其规则被这样处理:
·目标是文件,依赖也是文件。若依赖文件的时间,比目标文件的时间新,说明依赖文件被更新了。则运行规则包含的命令,产生新的目标文件。
·如果依赖的是另一条规则的目标,则先跳到另一条规则去执行命令,再返回当前规则。

·如果目标不是一个存在的文件,则一定执行。(目标不存在,必须执行)


例子:
577: main.o x.o y.o z.o
<Tab> gcc -o 577 main.o x.o y.o z.o
main.o: main.c               
gcc -c -o main.o main.c
. .
. .
. .

没有更多推荐了,返回首页