第1章、嵌入式Linux C语言开发工具

Size: px
Start display at page:

Download "第1章、嵌入式Linux C语言开发工具"

Transcription

1 任何应用程序的开发都离不开编辑器 编译器及调试器, 嵌入式 Linux 的 C 语言开发也一样, 需要拥有一套优秀的编辑 编译及调试工具 掌握这些工具的使用是至关重要的, 它直接影响到程序开发的效率 希望读者通过自己的实践, 熟练掌握这些工具的使用 通过本章的学习, 读者将会掌握如下内容 : 本章主要内容 q C 语言产生的历史背景 q 嵌入式 Linux 下 C 语言的开发环境 嵌入式 Linux C 语言开发工具 第 章 q 嵌入式 Linux 下的编辑器 vi q 嵌入式 Linux 下的编译器 GCC q 嵌入式 Linux 下的调试器 GDB q 嵌入式 Linux 下的工程管理器 make q 如何使用 autotools 来生成 Makefile q 嵌入式 Linux 下的综合编辑器 Emacs

2 嵌入式 Linux C 语言概述 在嵌入式系统中, 应用程序的主体是在宿主机中开发完成的 就嵌入式 Linux 而言, 此过程通常在安装有 Linux 的宿主机中完成 本章中介绍的是嵌入式 Linux 下 C 语言的开发工具, 用户在开发时先在 Linux 宿主机中对程序进行调试, 然后再进行交叉编译.. C 语言简史 C 语言于 20 世纪 70 年代诞生于美国的贝尔实验室 在此之前, 人们编写系统软件主要是使用汇编语言 汇编语言编写的程序依赖于计算机硬件, 其可读性和可移植性都比较差 而高级语言的可读性和可移植性虽然较汇编语言好, 但一般高级语言不具备低级语言能够直观地对硬件实现控制和操作而且执行速度快等特点 在这种情况下, 人们迫切需要一种既具有一般高级语言特性, 又具有低级语言特性的语言, 于是 C 语言就应运而生了 由于 C 语言既具有高级语言的特点, 又具有低级语言的特点, 因此迅速普及, 成为当今最有发展前途的计算机高级语言之一 C 语言既可以用来编写系统软件, 也可以用来编写应用软件 现在,C 语言已经被广泛地应用于计算机 机械 建筑 电子等各个行业 C 语言的发展历程如下 : C 语言最初是美国贝尔实验室的 D.M.Ritchie 在 B 语言的基础上设计出来的, 此时的 C 语言只是为了描述和实现 UNIX 操作系统的一种工作语言 在一段时间里,C 语言还只在贝尔实验室内部使用 975 年,UNIX 第 6 版公布后,C 语言突出的优点引起人们的普遍注意 977 年出现了可移植的 C 语言 978 年 UNIX 第 7 版的 C 语言成为后来被广泛使用的 C 语言版本的基础, 被称为标准 C 语言 983 年, 美国国家标准化协会 (ANSI) 根据 C 语言问世以来的各种版本, 对 C 语言进行发展和扩充, 并制定了新的标准, 称为 ANSI C 990 年, 国际标准化组织 ISO 制定了 ISO C 标准, 目前流行的 C 语言编译系统都是以它为标准的..2 C 语言特点 2

3 嵌入式 Linux C 语言开发工具 C 语言兼有汇编语言和高级语言的优点, 既适合于开发系统软件, 也适合于编写应用程序 被广泛应用于事务处理 科学计算 工业控制 数据库技术等领域 C 语言之所以能存在和发展, 并具有强大的生命力, 都要归功于其鲜明的特点 这些特点是多方面的, 归纳如下 第 章.C 语言是结构化的语言 C 语言采用代码及数据分隔的方式, 使程序的各个部分除了必要的信息交流外彼此独立 这种结构化方式可使程序层次清晰, 便于使用 维护以及调试 C 语言是以函数形式提供给用户的, 这些函数可方便地调用, 并具有多种循环 条件语句控制程序流向, 从而使程序完全结构化 2.C 语言是模块化的语言 C 语言主要用于编写系统软件和应用软件 一个系统软件的开发需要很多人经过几年的时间才能完成 一般来说, 一个较大的系统程序往往被分为若干个模块, 每一个模块用来实现特定的功能 在 C 语言中, 用函数作为程序的模块单位, 便于实现程序的模块化 在程序设计时, 将一些常用的功能模块编写成函数, 放在函数库中供其他函数调用 模块化的特点可以大大减少重复编程 程序设计时, 只要善于利用函数, 就可减少劳动量 提高编程效率 3. 程序可移植性好 C 语言程序便于移植, 目前 C 语言在许多计算机上的实现大都是由 C 语言编译移植得到的, 不同机器上的编译程序大约有 80% 的代码是公共的 程序不做任何修改就可用于各种型号的计算机和各种操作系统 因此, 特别适合在嵌入式开发中使用 4.C 语言运算符丰富 代码效率高 C 语言共有 34 种运算符, 使用各种运算符可以实现在其他高级语言中难以实现的运算 在代码质量上,C 语言可与汇编语言媲美, 其代码效率仅比用汇编语言编写的程序的代码低 0%~20%..3 嵌入式 Linux C 语言编程环境 嵌入式 Linux C 语言程序设计与在其他环境中的 C 程序设计很类似, 也涉及编辑器 编译链接器 调试器及项目管理器的使用 现在我们先对这 4 种工具进行简单介绍, 后面会对其一一进行讲解. 编辑器嵌入式 Linux 下的编辑器就如 Windows 下的 Word 记事本等一样, 完成对所录入字符的编辑功能, 最常用的编辑器有 vi(vim) 和 Emacs, 它们功能强大, 使用方便, 本书重点介绍 vi 3

4 2. 编译链接器编译过程包括词法 语法和语义的分析 中间代码的生成和优化 符号表的管理和出错处理等 在嵌入式 Linux 中, 最常用的编译器是 GCC 编译器 它是 GNU 推出的功能强大 性能优越的多平台编译器 与其他编译器相比,GCC 编译的代码的执行效率平均要高 20%~30% 3. 调试器调试器可以方便程序员在程序运行时进行源代码级的调试, 但不是代码执行的必备工具 在程序开发的过程当中, 调试所消耗的时间远远大于编写代码的时间 因此, 有一个功能强大 使用方便的调试器是必不可少的 GDB 可以方便地设置断点 单步跟踪等, 足以满足开发人员的需要 4. 项目管理器嵌入式 Linux 中的项目管理器 make 类似于 Windows 中 Visual C++ 里的 工程 管理, 它是一种控制编译或者重复编译代码的工具 另外, 它还能自动管理软件编译的内容 方式和时机, 使程序员能够把精力集中在代码的编写上而不是在源代码的组织上 嵌入式 Linux 编辑器 vi 的使用 vi 是 Linux 系统的第一个全屏幕交互式编辑工具 它从诞生至今一直得到广大用户的青睐, 历经数十年后仍然是人们主要使用的文本编辑工具, 足见其生命力之强, 其强大的编辑功能可以同任何一个最新的编辑器相媲美 虽然用惯了 Windows 中的 Word 等编辑器的读者在刚刚接触 vi 时或多或少会有些不适应, 但使用过一段时间后, 就能感受到它的方便与快捷 小知识 Linux 系统提供了一个完整的编辑器家族系列, 如 Ed Ex vi 和 Emacs 等, 按功 能它们可以分为两大类 : 行编辑器 (Ed Ex) 和全屏幕编辑器 (vi Emacs) 行编辑器每次只能对一行进行操作, 使用起来很不方便 而全屏幕编辑器可以对整个屏幕进行编辑, 用户编辑的文件直接显示在屏幕上, 从而克服了行编辑的那种不直观的操作方式, 便于用户学习和使用, 具有强大的功能.2. vi 的基本模式 vi 编辑器具有 3 种工作模式, 分别是命令行模式 (Command Mode) 插入模式 (Insert Mode) 和底行模式 (Last Line Mode), 各模式的功能区分如下 4

5 嵌入式 Linux C 语言开发工具. 命令行模式 在该模式下用户可以输入命令来控制屏幕光标的移动, 字符 单词或行的删除, 移 动复制某区段, 也可以进入到底行模式或者插入模式下 第 章 2. 插入模式用户只有在插入模式下才可以进行字符输入, 用户按 Esc 键可回到命令行模式下 3. 底行模式在该模式下, 用户可以将文件保存或退出 vi, 也可以设置编辑环境, 如寻找字符串 显示行号等 这一模式下的命令都以 : 开始 不过在一般使用时, 人们通常把 vi 简化成两个模式, 即将底行模式也归入命令行模式中.2.2 vi 的基本操作. 进入与离开 vi 进入 vi 可以直接在系统提示符下键入 vi < 文档名称 >,vi 可以自动载入所要编辑的文档或是创建一个新的文档 例如在 shell 中键入 vi hello.c( 新建文档 ) 即可进入 vi 画面, 如图. 所示 图. 在 vi 中打开 / 新建文档 进入 vi 后屏幕最左边会出现波浪符号, 凡是有该符号就代表该行目前是空的 默认进入的是命令行模式 要离开 vi 可以在底行模式下键入 :q ( 不保存离开 ), :wq ( 保存离开 ) 则是存档后再离开 ( 注意冒号 ), 如图.2 所示 5

6 图.2 在 vi 中退出文档 2.vi 中 3 种模式的切换 vi 的使用中,3 种模式的切换是最为常用的 在处理的过程中, 要时刻注意屏幕左下方的提示 在插入模式下, 左下方会有 插入 字样, 而在命令行或底行模式下则无提示 ) 命令行模式 底行模式转为插入模式在命令行模式或底行模式下转入到插入模式有 3 种方法, 如表. 所示 表. 命令行模式转到插入模式 特征命令作用 新增 插入 开始 a A i I o O 从光标所在位置后面开始新增资料, 光标后的资料随新增资料向后移动从光标所在列最后面的地方开始新增资料从光标所在位置前面开始插入资料, 光标后的资料随新增资料向后移动从光标所在列的第一个非空白字元前面开始插入资料在光标所在列下方新增一列, 并进入插入模式在光标所在列上方新增一列, 并进入插入模式 在这里, 最常用的是 i, 在转入插入模式后如图.3 所示 6

7 嵌入式 Linux C 语言开发工具 第 章 图.3 命令模式转入插入模式 2) 插入模式转为命令行模式 底行模式从插入模式转为命令行模式 底行模式比较简单, 只需使用 Esc 键即可 3) 命令行模式与底行模式转换命令行模式与底行模式间的转换不需要其他特别的命令, 而只需要直接键入相应模式中的命令键即可 3.vi 的删除 修改与复制在 vi 中进行删除 修改都可以在插入模式下使用键盘上的方向键及 Delete 键, 另外,vi 还提供了一系列的操作指令可以大大简化操作 这些指令记忆起来比较复杂, 希望读者能够配合操作来进行实验 以下命令都是在命令行模式下使用的 如表.2 所示为 vi 的删除 修改 复制与粘贴命令 表.2 vi 的删除 修改与复制命令 特征 ARM 作用 删除 修改 复制 x dd s S r 待修改字符 R yy nyy 删除光标所在的字符删除光标所在的行删除光标所在的字符, 并进入输入模式删除光标所在的行, 并进入输入模式修改光标所在的字符, 键入 r 后直接键入待修改字符进入取代状态, 可移动光标键入所指位置的修改字符, 该取代状态直到按 Esc 才结束复制光标所在的行复制光标所在的行向下 n 行 粘贴 p 将缓冲区内的字符粘贴到光标所在位置 7

8 4.vi 的光标移动由于许多编辑功能都是通过光标的定位来实现的, 因此, 掌握 vi 中光标移动的方法很重要 虽然使用方向键也可以实现 vi 的操作, 但 vi 的指令可以实现复杂的光标移动, 只要熟悉以后都非常方便, 希望读者都能切实掌握 如表.3 所示为 vi 中的光标移动指令, 这些指令都是在命令行模式下使用的 表.3 vi 中光标移动的命令 指令作用 0 移动到光标所在行的最前面 $ 移动到光标所在行的最后面 [Ctrl]d [Ctrl]f H M L b w e ^ 光标向下移动半页光标向下移动一页光标移动到当前屏幕的第一行第一列光标移动到当前屏幕的中间行第一列光标移动到当前屏幕的最后行第一列移动到上一个字的第一个字母移动到下一个字的第一个字母移动到下一个字的最后一个字母移动到光标所在行的第一个非空白字符 n- 向上移动 n 行 n+ 向下移动 n 行 ng 移动到第 n 行 5.vi 的查找与替换在 vi 中的查找与替换也非常简单, 其操作有些类似在 Telnet 中的使用 其中, 查找的命令在命令行模式下, 而替换的命令则在底行模式下 ( 以 : 开头 ), 其命令如表.4 所示 表.4 vi 的查找与替换命令 特征 ARM 作用 查找 /< 要查找的字符 > 向下查找要查找的字符?< 要查找的字符 > 向上查找要查找的字符 替换 :0,$s/string/string2/g 0,$: 替换范围从第 0 行到最后一行 s: 转入替换模式 string/string2: 把所有 string 替换为 string2 g: 替换一行中所有的 string, 否则只替换第一个 8

9 嵌入式 Linux C 语言开发工具 6.vi 的文件操作指令 vi 中的文件操作指令都是在底行模式下进行的, 所有的指令都是以 : 开头, 其命 令如表.5 所示 第 章 表.5 vi 的文件操作指令 指令作用 :q 结束编辑, 退出 vi :q! 不保存编辑过的文档 :w 保存文档, 其后可加要保存的文件名 :wq :zz 保存文档并退出 功能与 :wq 相同 :x 功能与 :wq 相同.2.3 vi 的使用实例分析 本节给出了一个 vi 使用的完整实例, 通过这个实例, 读者一方面可以熟悉 vi 的使用流程, 另一方面也可以熟悉 Linux 的操作, 希望读者能够首先自己思考每一步的操作, 再看后面的实例解析答案.vi 使用实例内容 () 在 /root 目录下建一个名为 vi 的目录 (2) 进入 vi 目录 (3) 将文件 /etc/passwd 复制到当前目录下 (4) 使用 vi 编辑当前目录下的 passwd (5) 将光标移到第 8 行 (6) 复制该行内容 (7) 将光标移到最后一行行首 (8) 粘贴复制行的内容 (9) 撤销第 8 步的动作 (0) 将光标移动到最后一行的行尾 () 粘贴复制行的内容 (2) 将光标移到第 20 行 (3) 删除该行 (4) 存盘但不退出 (5) 将光标移到首行 (6) 插入模式下输入 Hello,this is vi world! (7) 返回命令行模式 9

10 (8) 向下查找字符串 linux (9) 向上查找字符串 sys (20) 强制退出 vi, 不存盘 2.vi 使用实例解析在该实例中, 每一步的使用命令如下所示 ()mkdir /root/vi (2)cd /root/vi (3)cp /etc/inittab./ (4)vi./inittab (5):8<enter> (6)yy (7)G (8)p (9)u (0)$ ()p (2):20<enter> (3)dd (4):w<enter> (5)G (6)i 并输入 Hello,this is vi world! (7) 按 Esc 键 (8)/linux (9)?sys (20):q! 嵌入式 Linux 编译器 GCC 的使用.3. GCC 概述 作为自由软件的旗舰项目,Richard Stallman 在最初编写 GCC 的时候, 只是把它当 做一个 C 程序的编译器,GCC 仅意味着 GNU C Compiler 0

11 嵌入式 Linux C 语言开发工具 经过多年的发展,GCC 除了能支持 C 语言, 目前还支持 Ada 语言 C++ 语言 Java 语言 Objective C 语言 PASCAL 语言 COBOL 语言, 以及支持函数式编程和逻辑编程的 Mercury 语言等 GCC 也不再单指 GNU C 语言编译器, 而是变成了 GNU 编译器家族 正如前文中所述,GCC 的编译流程分为 4 个步骤, 分别为以下内容 : 预处理 (Pre-Processing) 编译 (Compiling) 汇编 (Assembling) 链接 (Linking) 编译器通过程序的扩展名来识别编写源程序所用的语言 由于不同的程序所需要执行编译的步骤是不同的, 因此 GCC 根据不同的扩展名对它们进行相应的处理, 如表.6 所示指出了不同扩展名的处理方式 第 章 表.6 GCC 所支持后缀名解释 后 缀 名 所对应的语言 编译流程.c C 源程序 预处理 编译 汇编.C/.cc/.cxx C++ 源程序 预处理 编译 汇编.m Objective-C 源程序 预处理 编译 汇编.i 已经过预处理的 C 源程序 编译 汇编.ii 已经过预处理的 C++ 源程序 编译 汇编.s/.S 汇编语言源程序 汇编.h 预处理文件 ( 头文件 ) 预处理.o 目标文件 链接.a/.so 静态 / 动态库文件 链接.3.2 GCC 编译流程分析 GCC 使用的基本语法如下 : gcc [opti0n filename] 这里的 option 是 GCC 使用时的一些选项, 通过指定不同的选项 GCC 可以实现其强 大的功能 这里的 filename 则是 GCC 要编译的文件,GCC 会根据用户所指定的编译选 项及文件的扩展名来进行相应的处理 本节从编译流程的角度讲解 GCC 的常见使用方法 先来分析一段简单的 C 语言程序 该程序由两个文件组成, 其中 hello.h 为头文 件, 在 hello.c 中包含了 hello.h, 其源文件如下所示 : /*hello.h*/ #ifndef _HELLO_H_

12 #define _HELLO_H_ typedef unsigned int u32_t; #endif /*hello.c*/ #include <stdio.h> #include "hello.h" int main() { u32_t i = 5; printf("hello, embedded world %d\n",i); } return 0;. 预处理阶段 GCC 的选项 -E 可以使编译器在预处理结束时就停止编译, 选项 -o 是指定 GCC 输出的结果, 其命令格式如下 : gcc E o [ 目标文件 ] [ 编译文件 ] 表.6 指出扩展名为.i 的文件是经过预处理的 C 源程序 要注意, hello.h 文 件是不能进行编译的 : [root@localhost gcc]# gcc E o hello.i hello.c 在此处, 选项 -o 指定要生成的文件 由表.6 可知,.i 文件为已经过预处理 的 C 源程序 以下列出了 hello.i 文件的部分内容 : # 2 "hello.c" 2 # "hello.h" typedef unsigned int u32_t; # 3 "hello.c" 2 int main() { u32_t i = 5; printf("hello, embedded world %d\n",i); } return 0; 由此可见,GCC 在预处理阶段把 hello.h 的内容添加到了 hello.i 2. 编译阶段 2

13 嵌入式 Linux C 语言开发工具 编译器在预处理结束之后进行编译 GCC 首先要检查代码的规范性 是否有语法错误等, 以确定代码实际要做的工作 在检查无误后, 就开始把代码翻译成汇编语言,GCC 的选项 -S 能使编译器在进行完编译之后就停止 由表.6 可知,.s 代表汇编语言源程序 因此, 此处生成的文件扩展名应设为.s : [root@localhost gcc]# gcc S o hello.s hello.i 第 章 以下列出了 hello.s 的内容, 可见 GCC 已经将其转化为汇编语言了 感兴趣的读者 可以分析一下这一行简单的 C 语言小程序用汇编代码是如何实现的 :.file "hello.c".section.rodata.lc0:.string "hello, embedded world %d\n".text.globl main.type main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-6, %esp movl $0, %eax addl $5, %eax addl $5, %eax shrl $4, %eax sall $4, %eax subl %eax, %esp movl $5, -4(%ebp) subl $8, %esp pushl -4(%ebp) pushl $.LC0 call printf addl $6, %esp leave ret.size main,.-main.section.note.gnu-stack,"",@progbits..ident "GCC: (GNU) (Red Hat )" 可以看到, 这一小段 C 语言的程序在汇编中已经复杂很多了, 这也是 C 语言作为高 级语言的优势所在 3. 汇编阶段 汇编阶段是把编译阶段生成的.s 文件生成目标文件, 在此使用选项 -c 就可看 到汇编代码已转化为.o 的二进制目标代码了, 如下所示 : [root@localhost gcc]# gcc c hello.s o hello.o 4. 链接阶段 3

14 在成功编译之后, 就进入了链接阶段 这里涉及一个重要的概念 : 函数库 在这个程序中并没有定义 printf 的函数实现, 在预编译中包含的 stdio.h 中也 只有该函数的声明, 而没有定义函数的实现 那么, 是在哪里实现 printf 函数的呢? 最后的答案是 : 系统把这些函数实现都已经放入名为 libc.so.6 的库文件中去了 在 没有特别指定时,GCC 会到系统默认的搜索路径 /lib 或 /usr/lib 下进行查找 找到 libc.so.6 后对需要的函数进行处理, 这样就能在程序执行时调用函数 printf, 而这也就是链接 的作用 完成了链接之后,GCC 就可以生成可执行文件, 其命令如下所示 : [root@localhost gcc]# gcc hello.o o hello 运行该可执行文件, 出现正确的结果 : [root@localhost gcc]#./hello hello, embedded world GCC 警告提示 本小节主要讲解 GCC 的警告提示功能 GCC 包含完整的出错检查和警告提示功能, 它们可以帮助 Linux 程序员写出更加专业和高效的代码 千万不要忽视这些警告信息, 在很多情况下, 含有警告信息的代码往往会有意想不到的运行结果 读者可以先阅读以下代码 : #include<stdio.h> void main(void) { long long tmp = ; printf("this is a bad code!\n"); } 虽然这段代码运行的结果是正确的, 但还有以下问题 ain 函数的返回值被声明为 void, 但实际上应该是 int 使用了 GNU 语法扩展, 即使用 long long 来声明 64 位整数, 不符合 ANSI/ISO C 语言标准 main 函数在终止前没有调用 return 语句 GCC 的警告提示选项有很多种类型, 主要可分为 Wall 类和非 Wall 类.Wall 类警告提示 这一类警告提示选项占了 GCC 警告选项的 90% 以上, 它不仅包含打开所有警告等 功能, 还可以单独对常见错误分别指定警告 这些常见的警告选项如表.7 所示 ( 这些 选项可供读者在实际操作时查阅使用 ) 表.7 GCC 的 Wall 类警告提示选项 4

15 嵌入式 Linux C 语言开发工具 -Wall 选项作用 -Wchar-subscripts 打开所有类型语法警告, 建议读者养成使用该选项的习惯 如果数组使用 char 类型变量作为下标值的话, 则发出警告 因为在某些平台上可能默认为 signed char, 一旦溢出, 就可能导致某些意外的结果 第 章 续表 选项作用 -Wcomment -Wformat -Wimplicit -Wmissing-braces -Wparentheses -Wsequence-point -Wswitch -Wunused-function -Wunused-label -Wunused-variable -Wunused-value -Wunused-parameter -Wuninitialized 当 '/*' 出现在 '/*... */' 注释中, 或者 '\' 出现在 '//...' 注释结尾处时, 使用 -Wcomment 会给出警告, 它很可能会影响程序的运行结果 检查 printf 和 scanf 等格式化输入输出函数的格式字符串与参数类型的匹配情况, 如果发现不匹配则发出警告 某些时候格式字符串与参数类型的不匹配会导致程序运行错误, 所以这是个很有用的警告选项 该警告选项实际上是 -Wimplicit-int 和 -Wimplicit-function-declaration 两个警告选项的集合 前者在声明函数却未指明函数返回类型时给出警告, 后者则是在函数声明前调用该函数时给出警告 当聚合类型或者数组变量的初始化表达式没有用大括号 {} 括起时, 给出警告 这是一个很有用的警告选项, 它能帮助用户从那些看起来语法正确但却由于操作符优先级或者代码结构 障眼 而导致错误运行的代码中解脱出来 关于顺序点 (Sequence Point), 在 C 标准中有解释, 不过很晦涩 我们在平时编码中要尽量避免写出与实现相关 受实现影响的代码 而 -Wsequence-point 选项恰恰可以帮我们这个忙, 它可以帮我们查出这样的代码来, 并给出其警告 这个选项的功能浅显易懂, 通过文字描述也可以清晰地说明 当以一个枚举类型 (Enum) 作为 switch 语句的索引时但却没有处理 default 情况, 或者没有处理所有枚举类型定义范围内的情况时, 该选项会给出警告 警告存在一个未使用的 static 函数的定义或者存在一个只声明却未定义的 static 函数 用来警告存在一个使用了却未定义或者存在一个定义了却未使用的 label 用来警告存在一个定义了却未使用的局部变量或者非常量 static 变量 用来警告一个显式计算表达式的结果未被使用 用来警告一个函数的参数在函数的实现中并未被用到 该警告选项用于检查一个局部自动变量在使用之前是否已经初始化了或者在一个 longjmp 调用可能修改一个 non-volatile automatic variable 时给出警告 这些警告提示读者可以根据自己的不同情况进行相应的选择, 这里最为常用的是 -Wall, 上面的这一小段程序使用该警告提示后的结果是 : [root@ft charpter2]# gcc -Wall wrong.c -o wrong wrong.c:4: warning: return type of 'main' is not 'int' wrong.c: In function 'main': wrong.c:5: warning: unused variable 'tmp' 可以看出, 使用 -Wall 选项找出了未使用的变量 tmp 以及返回值的问题, 但没有 找出无效数据类型的错误 2. 非 Wall 类警告提示 非 Wall 类的警告提示中最为常用的两种是 -ansi 和 -pedantic 5

16 )-ansi 该选项强制 GCC 生成标准语法所要求的告警信息, 尽管这还并不能保证所有没有警 告的程序都是符合 ANSI C 标准的 使用该选项的运行结果如下所示 : [root@ft charpter2]# gcc -ansi wrong.c -o wrong wrong.c: In function 'main': wrong.c:4: warning: return type of 'main' is not 'int' 可以看出, 该选项并没有发现 long long 这个无效数据类型的错误 2)-pedantic 该选项允许发出 ANSI C 标准所列的全部警告信息, 同样也保证所有没有警告的程 序都是符合 ANSI C 标准的 使用该选项的运行结果如下所示 : [root@ft charpter2]# gcc -pedantic wrong.c -o wrong wrong.c: In function 'main': wrong.c:5: warning: ISO C90 does not support 'long long' wrong.c:4: warning: return type of 'main' is not 'int' 可以看出, 使用该选项发现了 long long 这个无效数据类型的错误.3.4 GCC 使用库函数.Linux 函数库介绍 函数库可以看做是事先编写的函数集合, 它可以与主函数分离, 使得程序模块化, 从而增加代码的复用性 Linux 中函数库包括两类 : 静态库和共享库 静态库的代码在编译时就已连接到开发人员开发的应用程序中, 而共享库是在程序 开始运行时被加载的 由于在使用共享库时程序中并不包括库函数的实现代码, 只是包含了对库函数的引 用, 因此程序代码的规模比较小 系统中可用的库都安装在 /usr/lib 和 /lib 目录下 库文件名由前缀 lib 和库名以及扩展 组成 根据库的类型不同, 扩展名也不一样 注意 共享库的扩展名由.so 和版本号组成 静态库的扩展名为.a 例如, 数学共享库的库名为 libm.so.5, 这里的标识字符为 m, 版本号为 5,libm.a 则是静态数学库 在 Linux 系统中系统所用的库都存放在 /usr/lib 和 /lib 目录中 2. 相关路径选项 有些时候库文件并不存放在系统默认的路径下 因此, 要通过路径选项来指定相关 的库文件位置, 这里首先介绍两个常用选项的使用方法 6

17 嵌入式 Linux C 语言开发工具 )-I <dir> GCC 使用默认的路径来搜索头文件, 如果想要改变搜索路径, 用户可以使用 -I 选项 -I<dir> 选项可以在头文件的搜索路径列表中添加 <dir> 目录 这样,GCC 就会 到指定的目录去查找相应的头文件 比如在 /root/workplace/gcc 下有两个文件 : hello.c #include <my.h> int main() { printf("hello!!\n"); return 0; } 第 章 my.h #include <stdio.h> 这样, 就可在 GCC 命令行中加入 -I 选项, 其命令如下所示 : [root@localhost gcc] gcc hello.c I/root/workplace/gcc/ -o hello 这样,GCC 就能够正确地编译程序 小持巧 在 include 语句中, <> 表示在标准路径中搜索头文件, 在 Linux 中默认为 /usr/include 在上例中, 可把 hello.c 的 #include <my.h> 改为 #include "my.h", 这样就不需要加上 -I 选项了 2)-L <dir> 选项 -L <dir> 的功能与 -I <dir> 类似, 其区别就在于 -L 选项是用于指明库 文件的路径 例如, 有程序 hello_sq.c 需要用到目录 /root/workspace/gcc/lib 下的一个 动态库 libsunq.so, 则只需键入如下命令即可 : [root@localhost gcc] gcc hello_sq.c L/root/workspace/gcc/lib lsunq o hello_sq 注意 -I <dir> 和 -L< dir> 都只是指定了路径, 而没有指定文件, 因此不能在路 径中包含文件名 3. 使用不同类型链接库 使用不同类型的链接库的方法很相似, 都是使用选项 -l ( 注意这里是小写的 L ) 该选项用于指明具体使用的库文件 由于在 Linux 中函数库的命名规则都是以 lib 开 头的, 因此, 这里的库文件只需填写 lib 之后的内容即可 例如, 有静态库文件 libm.a, 在调用时只需写作 -lm ; 同样对于共享库文件 libm.so, 在调用时也只需写作 -lm 即可, 其整体调用命令类似如下 : [root@localhost gcc] gcc -o dynamic -L /root/lq/testc/lib/dynamic.o -lmydynamic 7

18 那么, 若系统中同时存在库名相同的静态库文件和共享库文件时, 该链接选项究竟会调用静态库文件还是共享库文件呢? GCC 默认链接的是共享库, 这是由于 Linux 系统中默认的是采用动态链接的方式 如果用户要链接同名的静态库, 则在 -l 之前需要添加选项 -static 例如, 链接 libm.a 库文件的选项是 -static -lm.3.5 GCC 代码优化 GCC 可以对代码进行优化, 它通过编译选项 -On 来控制优化代码的生成, 其中 n 是一个代表优化级别的整数 对于不同版本的 GCC 来讲,n 的取值范围及其对应的优化效果并不完全相同, 比较典型的范围是从 0 到 2 或 3 不同的优化级别对应不同的优化处理工作 如使用优化选项 -O 主要进行线程跳转 (Thread Jump) 和延迟退栈 (Deferred Stack Pops) 两种优化 使用优化选项 -O2 除了完成所有 -O 级别的优化之外, 同时还要进行一些额外的调整工作, 如处理器指令调度等 ; 选项 -O3 则还包括循环展开和其他一些与处理器特性相关的优化工作 虽然优化选项可以加快代码的运行速度, 但对于调试而言将是一个很大的挑战 因为代码在经过优化之后, 原先在源程序中声明和使用的变量很可能不再使用 ; 控制流也可能会突然跳转到其他的地方 ; 循环语句也有可能因为循环展开而变得到处都有, 所有这些都将使调试工作异常艰难 建议开发人员在调试程序的时候不使用任何优化选项 只有当程序完成调试, 准备发布的时候再对其进行优化 嵌入式 Linux 调试器 GDB 的使用 在程序编译通过生成可执行文件之后, 就进入了程序的调试环节 调试一直是程序开发中的重中之重, 如何使程序员能够迅速找到错误的原因是一款调试器的首要目标 GDB 是 GNU 开源组织发布的一个 Linux 下的程序调试工具, 它是一种强大的命令行调试工具 一个出色的调试器需要有以下几项功能 : 能够运行程序, 设置所有能影响程序运行的参数 能够让程序在指定的条件下停止运行 能够在程序停止时检查所有参数的情况 能够根据指定条件改变程序的运行.4. GDB 使用实例 8

19 嵌入式 Linux C 语言开发工具 下面通过一个简单的实例使读者对 GDB 有一个感性的认识, 这里所介绍的指令都 是 GDB 中最为基本也是最为常用的指令, 希望读者能够动手操作, 掌握 GDB 的使用方 法 程序代码如下 : 第 章 #include <stdio.h> /* 子函数 add: 将自然数从 ~m 相加 */ void add(int m) { int i,n=0; for(i=; i<=m;i++) { n += i; } printf("the sum of -%d in add is %d\n", m,n); } int main() { int i,n=0; add(50); for(i=; i<=50; i++) { n += i; } printf("the sum of -50 is %d \n", n ); } 注意, 此程序用 GCC 进行编译时要加上 -g 选项. 进入 GDB 进入 GDB 只需输入 GDB 和要调试的可执行文件即可, 如下所示 : [root@localhost gdb]# gdb test GNU gdb (GDB) 7.2-ubuntu Copyright (C) 200 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to chang and redistribute it. There is NO WARRANTY, to the extent perimitted by law. Type show copying and show warranty for details. This GDB was configured as i686-linux-gnu. For bug reporting instructions, please see: (gdb) 可以看出, 在 GDB 的启动画面中指出了 GDB 的版本号 遵循的许可等信息, 接下 来就进入了由 (gdb) 开头的命令行界面了 2. 查看文件 在 GDB 中键入 l (list) 就可以查看程序的源码, 如下所示 : (gdb) l 4 { 9

20 5 int i,n=0; 6 for(i=; i<=m;i++) 7 { n += i; } 8 printf("the sum of -%d in add is %d\n", m,n); 9 } 0 int main() 2 { 3 int i,n=0; (gdb) l 4 add(50); 5 for(i=; i<=50; i++) 6 { 7 n += i; 8 } 9 printf("the sum of -50 is %d \n", n ); 20 2 } 22 可以看出,GDB 列出的源代码中明确地给出了对应的行号, 这样可以大大地方便代 码的定位 注意 在一般情况下, 源代码中的行号与用户书写程序中的行号是一致的, 但有时由于 用户的某些编译选项会导致行号不一致的情况, 因此, 一定要查看在 GDB 中的行号 3. 设置断点 设置断点可以使程序执行到某个位置时暂时停止, 程序员在该位置处可以方便地查 看变量的值 堆栈情况等, 从而找出问题的症结所在 在 GDB 中设置断点非常简单, 只需在 b 后加入对应的行号即可 ( 这是最常用的 方法 ), 其命令如下所示 : (gdb) b 6 Breakpoint at 0x804846d: file test.c, line 6. 要注意的是, 在 GDB 中利用行号设置断点是指代码运行到对应行之前暂停 如上 例中, 代码运行到第 6 行之前暂停 ( 并没有执行第 6 行的代码 ) 4. 查看断点处情况 在设置完断点之后, 用户可以键入 info b 来查看断点设置情况 在 GDB 中可以 设置多个断点 : (gdb) info b Num Type Disp Enb Address What breakpoint keep y 0x d in main at test.c:6 5. 运行代码 20

21 嵌入式 Linux C 语言开发工具 接下来就可运行代码了,GDB 默认从首行开始运行代码, 键入 r (run) 即可, 如 下所示 : (gdb) r Starting program: /home/yul/book/test 第 章 Breakpoint, add (m=50) at test.c:6 6 for(i=; i<=m;i++) 可以看到, 程序运行到断点处就停止了 6. 查看变量值 在程序暂停运行之后, 程序员可以查看断点处的相关变量值 在 GDB 中只需键入 p 变量名 即可, 如下所示 : (gdb) p n $ = 0 (gdb) p i $2 = 在此处, 为什么变量 i 的值是如此奇怪的一个数字呢? 原因就在于程序是在断点设 置的对应行之前停止的, 此时代码没有把变量 i 的值赋为 0, 而只是一个随机的数字 但 变量 n 是在程序第 5 行赋值的, 所以此时 n 的值已经为 0 小技巧 GDB 在显示变量值时都会在对应值之前加上 $N 标记, 它是当前变量值的引用标 记, 所以以后若想再次引用此变量就可以直接写作 $N, 而无须写冗长的变量名 7. 观察变量 在某一循环处, 程序员往往希望能够观察一个变量的变化情况, 这时就可以键入命 令 watch 来观察变量的变化情况, 如下所示 : (gdb) watch n Hardware watchpoint 2: n 可以看到,GDB 在 n 设置了观察点 注意 在此处必须键入完整的命令 watch, 因为在 GDB 中有不少以 w 开头的命令, 如 where while 等 8. 单步运行 单步运行是指一次只运行一条语句, 这样可以方便程序员来查看程序运行的结果, 在此处只需键入 n (next) 即可, 如下所示 : (gdb) n 7 n += i; (gdb) n 2

22 Hardware watchpoint 2: n Old value = 5 New value = 2 可以看到, 随着程序的单步运行, 当变量 n 的值发生变化时,GDB 就会自动显示出 n 的变化情况 9. 程序继续运行 命令 c (continue) 可以使程序继续往下运行, 直到再次遇到断点或程序结束, 如 下所示 : (gdb) c Continuing. The sum of -50 is 275 Program exited with code 退出 GDB 退出 GDB 只需使用指令 q (quit) 即可, 如下所示 : (gdb) q [root@localhost gcc] 以上所介绍的是 GDB 中最为常见的命令, 下面几节将会详细讲解其他的一些命令.4.2 设置 / 删除断点 GDB 中有丰富的断点设置 删除命令, 可以满足用户各个方面的需求 如表.8 所 示列出了 GDB 中常见的断点设置及删除命令 表.8 GCC 中常见断点设置与删除指令 命令格式作用 break+ 设置断点的行号 tbreak+ 行号或函数名 break+filename+ 行号 break+<0x > break+ 行号 +if+ 条件 info breakpoints/watchpoints clear+ 要清除断点的行号 delete+ 要清除断点的编号 disable+ 断点编号 enable+ 断点编号 用于在程序中对应行设置断点 设置临时断点, 到达后被自动删除 用于在指定文件的对应行设置断点 用于在内存某一位置处暂停 用于设置条件断点, 在循环中使用非常方便 查看断点 / 观察点的情况 用于清除对应行的断点 用于清除断点和自动显示的表达式的命令 与 clear 的不同之处 :clear 要给出断点的行号,delete 要给出断点的编号 用 clear 命令清除断点时 GDB 会给出提示, 而用 delete 清除断点时 GDB 不会给出任何提示 让所设断点暂时失效 如果要让多个编号处的断点失效可将编号之间用空格隔开 与 disable 相反 22

23 嵌入式 Linux C 语言开发工具 awatch+ 变量 rwatch+ 变量 watch+ 变量 设置一个观察点, 当变量被读出或写入时程序被暂停 设置一个观察点, 当变量被程序读时, 程序被暂停 同 awatch 第 章 小知识 在多线程的程序中, 观察点的作用很有限,GDB 只能观察一个线程中的表达式的 值 如果用户确信表达式只被当前线程所存取, 那么使用观察点才有效 GDB 无法检 测一个非当前线程对表达式值的改变.4.3 数据相关命令 在 GDB 中也有丰富的数据显示相关命令, 它们使用户可以以各种形式显示所要查看的数据, 数据相关命令如表.9 所示 表.9 GDB 中数据相关指令 命令格式作用 display+ 表达式 info display delete+display 编号 disable+display 编号 enable+display 编号 undisplay+display 编号 whatis+ 变量 print(p)+ 变量或表达式 set+ 变量 = 变量值 该命令用于显示表达式的值, 使用该命令后, 每当程序运行到断点处都会显示表达式的值 用于显示当前所有要显示值的表达式的有关情况 用于删除一个要显示值的表达式, 调用这个命令删除一个表达式后, 被删除的表达式将不被显示 使一个要显示的表达式暂时无效 disable diplay 的反操作 用于结束某个表达式值的显示 显示某个表达式的数据类型 用于打印变量或表达式的值 改变程序中一个变量的值 小技巧 在使用 print 命令时, 可以对变量按指定格式进行输出, 其命令格式为 :print / 变量名 + 格式 其中常用格式有以下几种 : x, 十六进制 ;d, 十进制 ;u, 无符号数 ;o, 八进制 ;c, 字符格式 ;f, 浮点数.4.4 调试运行环境相关命令 在 GDB 中控制程序的运行也是非常方便的, 用户可以自行设定变量值 调用函数 等, 其具体命令如表.0 所示 23

24 表.0 GDB 调试运行环境相关命令 命令格式作用 set args 设置运行参数 show args 参看运行参数 set width+ 数目设置 GDB 的行宽 cd+ 工作目录 run step(s) next(n) finish until+ 行数 continue(c) return< 返回值 > call+ 函数 切换工作目录程序开始执行进入式 ( 会进入到所调用的子函数中 ) 单步执行非进入式 ( 不会进入到所调用的子函数中 ) 单步执行一直运行到函数返回运行到函数某一行执行到下一个断点或程序结束改变程序流程, 直接结束当前函数, 并将指定值返回在当前位置执行所要运行的函数.4.5 堆栈相关命令 GDB 中也提供了多种堆栈相关的命令, 可以查看堆栈的情况 寄存器的情况等, 其具体命令如表. 所示 表. GDB 中堆栈相关命令 命令格式作用 backtrace 或 bt frame info reg info stack up down 用来打印栈帧指针, 也可以在该命令后加上要打印的栈帧指针的个数该命令用于打印栈帧查看寄存器使用情况查看堆栈情况跳到上一层函数与 up 相对 make 工程管理器 24

25 嵌入式 Linux C 语言开发工具 前面几节主要介绍如何在 Linux 环境下使用文本编辑器, 如何使用 GCC 编译出可执行文件, 以及如何使用 GDB 来调试程序 既然所有的工作都已经完成了, 为什么还需要 make 这个工程管理器呢? 工程管理器可以用来管理较多的文件 可以试想一下 : 一个由上百个源文件构成的项目, 如果其中只有一个或少数几个文件进行了修改, 按照之前所学的 GCC 的用法, 就不得不把所有的文件重新编译一遍 原因就在于编译器并不知道哪些文件是最近更新的, 所以, 程序员就不得不处理所有的文件来完成重新编译工作 显然, 开发人员需要一个能够自动识别出那些被更新的代码文件并实现整个工程自动编译的工具 实际上,make 就是一个自动编译管理器, 能够根据文件时间戳自动发现更新过的文件从而减少编译的工作量 同时, 它通过读入 Makefile 文件的内容来执行大量的编译工作, 用户只需一次编写简单的编译语句即可 它大大提高了项目开发和维护的工作效率, 几乎所有嵌入式 Linux 下的项目编程均会涉及 make 管理器, 希望读者能够认真学习本节内容 第 章.5. Makefile 基本结构 Makefile 用来告诉 make 如何编译和连接一个程序, 是 make 读入的唯一配置文件, 本小节主要讲解 Makefile 的编写规则 在一个 Makefile 中通常包含如下内容 : 需要由 make 工具创建的目标体 (target), 目标体通常是目标文件 可执行文件 或是一个标签 要创建的目标体所依赖的文件 (dependency_file) 创建每个目标体时需要运行的命令 (command) 它的格式为 : target: dependency_files command 例如, 有两个文件分别为 hello.c 和 hello.h, 希望创建的目标体为 hello.o, 执行的命 令为 GCC 编译指令 :gcc c hello.c, 那么, 对应的 Makefile 就可以写为以下形式 : #The simplest example hello.o: hello.c hello.h gcc c hello.c o hello.o 接着就可以使用 make 了 使用 make 的格式为 :make target, 这样 make 就会自动 读入 Makefile( 也可以是首字母小写 makefile) 执行对应 target 的 command 语句, 并会 找到相应的依赖文件, 如下所示 : [root@localhost makefile]# make hello.o gcc c hello.c o hello.o [root@localhost makefile]# ls 25

26 hello.c hello.h hello.o Makefile 可以看到,Makefile 执行了 hello.o 对应的命令语句, 并生成了 hello.o 目标体 注意 在 Makefile 中的每一个 command 前必须有 Tab 符, 否则在运行 make 命令时 会出错 上面示例的 Makefile 在实际中是几乎不存在的, 因为它过于简单, 仅包含两个文件 和一个命令, 在这种情况下完全不需要编写 Makefile, 而只需在 shell 中直接输入命令即 可 在实际中使用的 Makefile 往往是包含很多的命令的, 一个项目也会包含多个 Makefile 下面就对较复杂的 Makefile 进行讲解 以下这个工程包含 3 个头文件和 8 个 C 文件, 其 Makefile 如下所示 : edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o gcc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h gcc -c main.c o main.o kbd.o : kbd.c defs.h command.h gcc -c kbd.c o kbd.o command.o : command.c defs.h command.h gcc -c command.c o command.o display.o : display.c defs.h buffer.h gcc -c display.c o display.o insert.o : insert.c defs.h buffer.h gcc -c insert.c o insert.o search.o : search.c defs.h buffer.h gcc -c search.c o search.o files.o : files.c defs.h buffer.h command.h gcc -c files.c o files.o utils.o : utils.c defs.h gcc -c utils.c o utils.o clean : rm edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o 这里的反斜杠 \ 是换行符的意思, 用于增加 Makefile 的可读性 读者可以把这些 内容保存在文件名为 Makefile 或 makefile 的文件中, 然后在该目录下直接输入命令 make 就可以生成可执行文件 edit 如果想要删除可执行文件和所有的中间目标文件, 只需要 简单地执行一下 make clean 即可 在这个 makefile 中, 目标文件 (target) 包含以下内容 : 可执行文件 edit 和中间目标 文件 *.o, 依赖文件 (dependency_file) 就是冒号后面的那些 *.c 文件和 *.h 文件 26

27 嵌入式 Linux C 语言开发工具 每一个.o 文件都有一组依赖文件, 而这些.o 文件又是可执行文件 edit 的依赖文件 依赖关系表明目标文件是由哪些文件生成的 换而言之, 目标文件是由哪些文件更新的 在定义好依赖关系后, 后面的一行命令定义了如何生成目标文件 请读者注意, 这些命令都是以一个 Tab 键作为开头的 值得注意的是,make 工程管理器并不关心命令是如何工作的, 它只负责执行用户事先定义好的命令 同时,make 还会比较目标文件和依赖文件的最后修改日期, 如果依赖文件的日期要比目标文件的日期更新, 或者目标文件并不存在的话, 那么,make 就会执行后续定义的命令 这里要说明一点的是,clean 不是一个文件, 它只不过是一个动作名称, 也可称其为标签, 不依赖于其他任何文件 若用户想要执行其后的命令, 就要在 make 命令后显示地指出这个标签的名字 这个方法非常有用, 通常用户可以在一个 Makefile 中定义一些和编译无关的命令, 比如程序的打包 备份或删除等 第 章.5.2 Makefile 变量 为了进一步简化 Makefile 的编写和维护,make 允许在 Makefile 中创建和使用变量 变量是在 Makefile 中定义的名字, 用来代替一个文本字符串, 该文本字符串称为该变量的值 变量的值可以用来代替目标体 依赖文件 命令及 Makefile 文件中的其他部分 在 Makefile 中的变量定义有两种方式 : 一种是递归展开方式, 另一种是简单方式 递归展开方式定义的变量是在引用该变量时进行替换的, 即如果该变量包含了对其他变量的引用, 则在引用该变量时一次性将内嵌的变量全部展开 虽然这种类型的变量能够很好地完成用户的指令, 但是它也有严重的缺点, 如不能在变量后追加内容, 因为语句 CFLAGS = $(CFLAGS) O 在变量扩展过程中可能导致无穷循环 为了避免上述问题, 简单扩展型变量的值在定义处展开, 并且只展开一次, 因此它不包含任何对其他变量的引用, 从而消除了变量的嵌套引用 递归展开方式的定义格式为 :VAR=var 简单扩展方式的定义格式为 :VAR:=var make 中变量的使用格式为 :$(VAR) 注意 变量名是不包括 :, #, = 结尾空格的任何字符串 同时, 变量名中包含字母 数字及下画线以外的情况应尽量避免, 因为它们可能在将来被赋予特别的含义 变量名是大小写敏感的, 例如变量名 foo FOO 和 Foo 代表不同的变量 推荐在 Makefile 内部使用小写字母作为变量名, 预留大写字母作为控制隐含规则参数或用户重载命令选项参数的变量名 27

28 在上面的例子中, 先来看看 edit 这个规则 : edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o 读者可以看到.o 文件的字符串被重复了两次, 如果需要加入一个新的.o 文件, 那么用户需要在这两处分别加入 ( 其实应该是 3 处, 另外一处在 clean 中 ) 当然, 这个实例的 Makefile 并不复杂, 所以在这两处分别添加也没有太多的工作量 但 如果 Makefile 变得复杂, 那么用户就很有可能会忽略一个需要加入的地方, 从而导致编 译失败 所以, 为了使 Makefile 易维护, 推荐在 Makefile 中尽量使用变量这种形式 这样, 用户在这个实例中就可以按以下的方式来定义变量 : OBJS = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o 这里是以递归展开的方式来进行定义的 在此之后, 用户就可以很方便地在 Makefile 中以 $(objects) 的方式来使用这个变量了, 于是改良版 Makefile 就变为 : OBJS = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o edit : $(objects) gcc -o edit $(objects) main.o : main.c defs.h gcc -c main.c o main.o kbd.o : kbd.c defs.h command.h gcc -c kbd.c o kbd.o command.o : command.c defs.h command.h gcc -c command.c o command.o display.o : display.c defs.h buffer.h gcc -c display.c o display.o insert.o : insert.c defs.h buffer.h gcc -c insert.c o insert.o search.o : search.c defs.h buffer.h gcc -c search.c o search.o files.o : files.c defs.h buffer.h command.h gcc -c files.c o files.o utils.o : utils.c defs.h gcc -c utils.c o utils.o clean : rm edit $(OBJS) 可以看到, 如果这时又有新的.o 文件需要加入, 用户只需简单地修改一下变量 OBJS 的值就可以了 Makefile 中的变量分为用户自定义变量 预定义变量 自动变量及环境变量 如上 例中的 OBJS 就属于用户自定义变量, 其值由用户自行设定 预定义变量和自动变量无 须定义就可以在 Makefile 中使用, 其中部分有默认值, 当然用户也可以对其进行修改 28

29 嵌入式 Linux C 语言开发工具 预定义变量包含了常见编译器 汇编器的名称及编译选项, 如表.2 所示列出了 Makefile 中常见预定义变量及其部分默认值 第 章 表.2 Makefile 中常见预定义变量 命令格式含义 AR AS CC 库文件维护程序的名称, 默认值为 ar 汇编程序的名称, 默认值为 as C 编译器的名称, 默认值为 cc CPP C 预编译器的名称, 默认值为 $(CC) E CXX FC C++ 编译器的名称, 默认值为 g++ FORTRAN 编译器的名称, 默认值为 f77 RM 文件删除程序的名称, 默认值为 rm f ARFLAGS ASFLAGS CFLAGS CPPFLAGS CXXFLAGS FFLAGS 库文件维护程序的选项, 无默认值汇编程序的选项, 无默认值 C 编译器的选项, 无默认值 C 预编译的选项, 无默认值 C++ 编译器的选项, 无默认值 FORTRAN 编译器的选项, 无默认值 上例中的 CC 和 CFLAGS 是预定义变量, 其中由于 CC 没有采用默认值, 因此, 需要把 CC=gcc 明确列出来 由于常见的 GCC 编译语句中通常包含了目标文件和依赖文件, 而这些文件在 Makefile 文件中目标体的一行已经有所体现, 因此, 为了进一步简化 Makefile 的编写, 引入了自动变量 自动变量通常可以代表编译语句中出现的目标文件和依赖文件等, 并且具有本地含义 ( 即下一语句中出现的相同变量代表的是下一语句的目标文件和依赖文件 ), 如表.3 所示列出了 Makefile 中常见自动变量 表.3 Makefile 中常见自动变量 命令格式 含 义 $* 不包含扩展名的目标文件名称 $+ 所有的依赖文件以空格分开, 并以出现的先后为序, 可能包含重复的依赖文件 $< 第一个依赖文件的名称 $? 所有时间戳比目标文件晚的依赖文件, 并以空格分开 $@ 目标文件的完整名称 $^ 所有不重复的依赖文件, 以空格分开 29

30 $% 如果目标是归档成员, 则该变量表示目标的归档成员名称 自动变量的书写比较难记, 但是在熟练了之后会非常方便, 请读者结合下例中的自 动变量改写的 Makefile 进行记忆 : OBJS = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o CC = gcc CFLAGS = -Wall -O -g edit : $(objects) $(CC) $^ -o $@ main.o : main.c defs.h (CC) $(CFLAGS) -c $< -o $@ kbd.o : kbd.c defs.h command.h (CC) $(CFLAGS) -c $< -o $@ command.o : command.c defs.h command.h (CC) $(CFLAGS) -c $< -o $@ display.o : display.c defs.h buffer.h (CC) $(CFLAGS) -c $< -o $@ insert.o : insert.c defs.h buffer.h (CC) $(CFLAGS) -c $< -o $@ search.o : search.c defs.h buffer.h (CC) $(CFLAGS) -c $< -o $@ files.o : files.c defs.h buffer.h command.h (CC) $(CFLAGS) -c $< -o $@ utils.o : utils.c defs.h (CC) $(CFLAGS) -c $< -o $@ clean : rm edit $(OBJS) 另外, 在 Makefile 中还可以使用环境变量 使用环境变量的方法相对比较简单,make 在启动时会自动读取系统当前已经定义了的环境变量, 并且会创建与之具有相同名称和 数值的变量 但是, 如果用户在 Makefile 中定义了相同名称的变量, 那么用户自定义变 量将会覆盖同名的环境变量.5.3 Makefile 规则 Makefile 的规则包括目标体 依赖文件及其间的命令语句, 是 make 进行处理的依据 Makefile 中的一条语句就是一个规则 在上面的例子中显示地指出了 Makefile 中的规则关系, 如 $(CC) $(CFLAGS) -c $< -o $@, 为了简化 Makefile 的编写,make 还定义了隐式规则和模式规则, 下面就分别对 其进行讲解. 隐式规则 隐式规则能够告诉 make 怎样使用传统的技术完成任务, 这样, 当用户使用它们时 就不必详细指定编译的具体细节, 而只需把目标文件列出即可 make 会自动搜索隐式规 则目录来确定如何生成目标文件, 如上例可以写成 : 30

31 嵌入式 Linux C 语言开发工具 OBJS = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o CC = gcc CFLAGS = -Wall -O -g edit :$(objects) $(CC) $^ -o $@ main.o : main.c defs.h kbd.o : kbd.c defs.h command.h command.o : command.c defs.h command.h display.o : display.c defs.h buffer.h insert.o : insert.c defs.h buffer.h search.o : search.c defs.h buffer.h files.o : files.c defs.h buffer.h command.h utils.o : utils.c defs.h clean : rm edit $(OBJS) 第 章 为什么可以省略 (CC) $(CFLAGS) -c $< -o $@ 这句呢? 因为 make 的隐式规则指出 : 所有.o 文件都可自动由.c 文件使用命令 $(CC) $(CPPFLAGS) $(CFLAGS) -c file.c o file.o 生成 因此,Makefile 就可以进一步地简化了 注意 在隐式规则只能查找到相同文件名的不同扩展名文件, 如 kang.o 文件必须由 kang.c 文件生成 如表.4 所示给出了常见的隐式规则目录 表.4 Makefile 中常见隐式规则目录 对应语言后缀名规则 C 编译 :.c 变为.o C++ 编译 :.cc 或.C 变为.o Pascal 编译 :.p 变为.o $(CC) c $(CPPFLAGS) $(CFLAGS) $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(PC) -c $(PFLAGS) Fortran 编译 :.r 变为 -o $(FC) -c $(FFLAGS) 2. 模式规则 隐式规则仅仅能够用 make 默认的变量来进行操作 模式规则不同于隐式规则, 是用来定义相同处理规则的多个文件的, 模式规则能引 入用户自定义变量, 为多个文件建立相同的规则, 简化 Makefile 的编写 模式规则的格式类似于普通规则, 这个规则中的相关文件前必须用 % 标明, 然而在 这个实例中, 并不能使用这个模式规则.5.4 make 使用 3

32 使用 make 管理器非常简单, 只需在 make 命令的后面键入目标名即可建立指定的目标, 如果直接运行 make, 则建立 Makefile 中的第一个目标 此外 make 还有丰富的命令行选项, 可以完成各种不同的功能, 如表.5 所示列出了常用的 make 命令行选项 表.5 make 的命令行选项 命令格式 含 义 -C dir 读入指定目录下的 Makefile -f file 读入当前目录下的 file 文件作为 Makefile -i 忽略所有的命令执行错误 -I dir 指定被包含的 Makefile 所在目录 -n 只打印要执行的命令, 但不执行这些命令 -p 显示 make 变量数据库和隐含规则 -s 在执行命令时不显示命令 -w 如果 make 在执行过程中改变目录, 打印当前目录名 Eclipse 集成开发环境.6. Eclipse 简介 Eclipse 是著名的跨平台的集成开发环境 (IDE), 最初是由 IBM 公司开发的替代商业软件 Visual Age For Java 的下一代 IDE 开发环境 200 年 月贡献给开源社区, 现在它由非营利软件供应商联盟 Eclipse 基金会 (Eclipse Foundation) 管理 2005 年 7 月, 稳定版 3..0 发布, 目前最新的稳定版本为 3.7 Eclipse 本身只是一个框架平台, 最初主要用于 Java 语言的开发 但是众多插件的支持使得 Eclipse 可以支持其他语言的开发, 如 C/C++ C# Perl Cobol 等 许多软件开发商以 Eclipse 为框架开发了自己的 IDE 由于 Eclipse 平台用 Java 实现, 所以运行时需要 JRE(Java Runtime Environment) 的支持.6.2 Eclipse 相关术语 Eclipse 相关术语有如下几个 () 工作台 (Workbench): 提供了一个或多个透视图, 其界面如图.4 所示 (2) 透视图 (Perspective): 工作台中的一组视图和编辑器 每个透视图包括一组不同的视图, 它定义了视图在工作台中的布局, 如图.5 所示 32

33 嵌入式 Linux C 语言开发工具 第 章 图.4 工作台 图.5 透视图 (3) 视图 (View): 工作台内的可视组件, 通常用来浏览分层信息, 如图.6 所示 33

34 图.6 视图 所示 (4) 编辑器 (Editor): 工作台内的可视组件, 通常用来编辑或浏览信息, 如图.7 图.7 编辑器.6.3 安装 Eclipse 集成开发环境 ( 假设宿主机环境为 Ubuntu 0.0). 下载相关软件包 运行 Eclipse 需要安装 jdk(java 开发包 ) 和 Eclipse 开发包软件, 下载链接如下 : ()jdk-7-linux-i586.tar.gz ( (2)eclipse-cpp-indigo-incubation-linux-gtk.tar.gz( 2. 安装 jdk # cd /opt # tar jdk-7-linux-i586.tar.gz # vi /etc/bash.bashrc export JAVA_HOME=/opt/jdk.7.0 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib 3. 安装 Eclipse # cd /opt # tar xvf eclipse-cpp-indigo-incubation-linux-gtk.tar.gz #vi /etc/bash.bashrc export PATH=/opt/eclipse:$PATH.6.4 Eclipse 的使用 34

35 嵌入式 Linux C 语言开发工具 在上一节中我们学习了如何搭建 Eclipse 集成开发环境, 下面我们将和读者一起学习如何在 Eclipse 中创建工程, 编译和调试应用程序 () 在命令行下输入 eclipse 后按回车键, 进入开发界面, 如图.8 所示 # eclipse 第 章 图.8 (2) 选择 File New C Project 命令, 如图.9 所示 图.9 选择命令 35

36 (3) 设定工程名称, 选择工具链, 如图.0 所示 图.0 设定工程名称 (4) 创建的新的工程, 如图. 所示 图. 创建新的工程 (5) 向工程中添加源文件, 如图.2 和图.3 所示 36

37 嵌入式 Linux C 语言开发工具 第 章 图.2 向工程中添加源文件 () 图.3 向工程中添加源文件 (2) (6) 编辑代码, 如图.4 所示 37

38 图.4 编辑代码 (7) 编译工程, 如图.5 所示 图.5 编译工程 (8) 运行程序, 如图.6 所示 38

39 嵌入式 Linux C 语言开发工具 第 章 图.6 运行程序 (9) 用鼠标右键单击编辑框最左边浅色区域, 设置断点, 如图.7 所示 图.7 设置断点 39

40 (0) 调试程序, 如图.8 和图.9 所示 图.8 调试程序 () 图.9 调试程序 (2) 以上介绍的是如何使用 Eclipse 进行本机上的开发 对于嵌入式系统来说, 更多的时 候要进行交叉编译和调试 下面图示如何在 Eclipse 中为 ARM 平台开发应用程序 () 修改工程属性中的编译器 链接器和汇编器, 如图.20~ 图.22 所示 40

41 嵌入式 Linux C 语言开发工具 第 章 图.20 修改工程属性中的编译器 图.2 修改工程属性中的链接器 图.22 修改工程属性中的汇编器 4

42 (2) 设置完成后重新编译, 如图.23 所示 图.23 重新编译 (3) 在目标平台上运行编译好的程序, 等待主机端调试器的连接, 如图.24 所示 图.24 等待主机端调试器连接 42

43 嵌入式 Linux C 语言开发工具 (4) 在主机端 eclipse 中设置调试选项, 如图.25 所示 第 章 图.25 设置调试选项 (5) 指定调试器为 arm-linux-gdb, 如图.26 所示 图.26 指定调试器为 arm-linux-gdb 43

44 (6) 设定通过网络进行交叉调试, 如图.27 所示 图.27 设定通过网络进行交叉调试 (7) 开始交叉调试, 如图.28 和图.29 所示 图.28 交叉调试 () 44

45 嵌入式 Linux C 语言开发工具 第 章 图.29 交叉调试 (2) 本章小结 熟练使用开发工具是进行嵌入式 Linux C 语言开发的第一步 本章详细介绍了嵌入式 Linux C 语言开发常见的编辑器 vi 编译器 GCC 调试器 GDB 工程管理器 make 和集成开发环境 Eclipse 对于这些工具的使用方法, 读者一定要通过实际动手操作来熟练掌握 本章在每个工具的讲解中都提供了完整的实例供读者参考 本章习题. 在 vi 中编辑如下代码 ( 命名为 test.c), 并自行编写 Makefile 运行该程序 #include <stdio.h> #include <stdlib.h> int x = 0; int y = 5; int fun() 45

46 { } extern p, q; printf("p is %d, q is %d\n", p, q); return 0; int p = 8; int q = 0; int main() { fun(); printf("x is %d, y is %d\n", x, y); } 2. 在 Eclipse 中创建工程, 添加同样的代码, 使用 GCC 编译,GDB 调试该程序 资源分享 : 华清远见精品图书专区 : 2 华清远见嵌入式 Linux 视频下载基地 : 3 华清远见近期免费活动公告 : 4 华清远见学员大本营 : 联系我们 : 免费电话 : , 华清远见集团官网 : 华清远见企业学院 : 华清远见嵌入式学院 : 华清远见 3G 学院 : 46

<4D F736F F D20B5DA31D5C220C7B6C8EBCABD4C696E D3EFD1D4BFAAB7A2B9A4BEDF2E646F6378>

<4D F736F F D20B5DA31D5C220C7B6C8EBCABD4C696E D3EFD1D4BFAAB7A2B9A4BEDF2E646F6378> 嵌入式 Linux C 语言开发 作者 : 华清远见 第 1 章嵌入式 Linux C 语言开发工具 本章目标 任何应用程序的开发都离不开编辑器 编译器及调试器, 嵌入式 Linux 的 C 语言开发也一样, 它也有一 套优秀的编辑 编译及调试工具 掌握这些工具的使用是至关重要的, 它直接影响到程序开发的效率 希望读者通过自己的实践, 熟练 掌握这些工具的使用 通过本章的学习, 读者将会掌握如下内容

More information

第2章、嵌入式Linux C语言开发工具

第2章、嵌入式Linux C语言开发工具 华清远见 嵌入式培训专家 http://www.farsight.com.cn 黑色经典 系列之 嵌入式 Linux C 语言应用程序设计 第 2 章 嵌入式 Linux C 语言开发工具 本章目标 任何应用程序的开发都离不开编辑器 编译器及调试器, 嵌入式 Linux 的 C 语言开发也一样, 它也有一套优秀的编辑 编译及调试工具 掌握这些工具的使用是至关重要的, 它直接影响到程序开发的效率 因此,

More information

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un Linux C July 27, 2016 Contents 1 Linux IDE 1 2 GCC 3 2.1 hello.c hello.exe........................... 5 2.2............................... 9 2.2.1 -Wall................................ 9 2.2.2 -E..................................

More information

Prepare.ppt [兼容模式]

Prepare.ppt [兼容模式] 课前实验 Linux 操作系统的安装 C 语言编程环境的设置 TinyOS 开发环境的设置 一 实验目的 1 学会在计算机或虚拟机环境中安装 Linux 操作系统 2 学会在 Linux 下进行 C 语言编程 3 掌握交叉编译开发, 学会在 Linux 下设置 TinyOS 开发环 境, 能够完成基于 NesC 的 TinyOS 应用程序开发 二 Linux 操作系统的安装 14.04.4-desktop-amd64.iso

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

第 1 页共 9 页 文档履历 版本号日期制 / 修订人内容描述 V 正式版本

第 1 页共 9 页 文档履历 版本号日期制 / 修订人内容描述 V 正式版本 V3s 项目 CamDroid 编译第三方程序 / V1.0 第 1 页共 9 页 文档履历 版本号日期制 / 修订人内容描述 V1.0 2014-04-23 正式版本 第 2 页共 9 页 目录 1. 交叉编译环境... 3 2. 第三方库的 Makefile 示例... 4 3. 第三方应用 Makefile 示例... 5 4. 第三方应用 CamLinux.mk 示例... 6 5. 常见错误...

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

Lecture05.GNU

Lecture05.GNU 杨亮 Topics GNU & Linux Linux 下编程的流程 GCC GDB Makefile 文件读写 文件操作 Richard Stallman GNU/GNU BlowFish/ Perl openssh James Gosling Thunderbird Daemon/BSD Tux/Linux Duke/Java Dino/Mozilla Richard Stallman GNU

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

Microsoft PowerPoint - 嵌入式系统设计课件第二讲.ppt

Microsoft PowerPoint - 嵌入式系统设计课件第二讲.ppt Embedded Linux 开发环境 Linux 操作系统概述 Linux 下的编辑器 Linux 下的编译器 Linux 下的 make 工具 Linux 的 FHS 1 Embedded Linux 操作系统概述 Linux 的系统架构 Linux Kernel 硬件 2 Embedded Linux 的硬件支持 Embedded Linux 是基于特定硬件平台的应用程序解决方案 Embedded

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

第3章、嵌入式Linux编程环境

第3章、嵌入式Linux编程环境 本内容包括常用的 Linux 开发工具使用技巧和 Linux 编程技术, 重点介绍常用的 Linux 编程工具和技巧 通过本学习可以使读者快速掌握基本的 Linux 开发工具, 为后续的嵌入式 Linux 开发打下基础 嵌入式 Linux 编程环境 Linux 编辑器 vi 的使用 Linux 系统提供了一个完整的编辑器家族系列, 如 ed ex vi 和 emacs 等 按功能可以分为两大类 :

More information

<4D F736F F D20B5DA33D5C220C7B6C8EBCABD4C696E7578B1E0B3CCBBB7BEB32E646F6378>

<4D F736F F D20B5DA33D5C220C7B6C8EBCABD4C696E7578B1E0B3CCBBB7BEB32E646F6378> 嵌入式 Linux 操作系统 作者 : 华清远见 第 3 章嵌入式 Linux 编程环境 本章目标 本章内容包括常用的 Linux 开发工具使用技巧和 Linux 编程技术 本章内容比 Linux 编程方面的书籍简略得多, 重点介绍常用的 Linux 编程工具和技巧 通过本 章学习可以使读者快速掌握基本的 Linux 开发工具, 为后续的嵌入式 Linux 开发打 下基础 3.1 Linux 编辑器

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Linux 操 作 系 统 基 础 介 绍 课 程 目 标 及 要 求 了 解 Linux 操 作 系 统 的 登 入 方 式 掌 握 常 用 命 令 的 基 本 用 法 能 够 熟 练 在 各 个 目 录 转 换 Outline 1. Linux 操 作 系 统 简 介 2. Linux 操 作 系 统 的 登 录 3. Linux 操 作 系 统 的 目 录 结 构 4. 常 用 命 令 5.

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Linux 环境下程序编译 曙光信息产业 ( 北京 ) 有限公司 提 纲 1. GCC 编译 2. Make 简介 3. 常用编译器 一个简单的例子 hello.c 用 vi 编写源文件 : #include void main() { printf( hello world, I am \n ); } 用 gcc 编译 运行 gcc hello.c./a.out 第二个例子 vim

More information

Linux 操作系统分析 Linux 操作系统分析 2 GNU 开发工具链简介 陈香兰 苏州研究院中国科学技术大学 Spring

Linux 操作系统分析 Linux 操作系统分析 2 GNU 开发工具链简介 陈香兰  苏州研究院中国科学技术大学 Spring 2 GNU 开发工具链简介 陈香兰 (xlanchen@ustc.edu.cn) 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 Spring 2011 工欲善其事, 必先利其器 -- 论语 Outline 前言 GCC GNU binutils Gdb 调试器 GNU make 软件工程工具 GNU ld 链接器 小结和作业 前言 GNU tools GNU tools

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft Word - linux命令及建议.doc

Microsoft Word - linux命令及建议.doc Linux 操 作 系 统 命 令 集 1 基 本 命 令 查 看 系 统 信 息 : uname -a 修 改 密 码 : passwd 退 出 : logout(exit) 获 取 帮 助 : man commands 2 文 件 和 目 录 命 令 显 示 当 前 工 作 目 录 : pwd 改 变 所 在 目 录 : cd cd - 切 换 到 上 一 次 使 用 的 目 录 cd 切 换

More information

03.DOC

03.DOC 华清远见 - 嵌入式培训专家 (www.farsight.com.cn) 第 3 章 Linux 下的 C 编程基础 本章目标在熟悉了 Linux 常见命令, 能够在 Linux 中熟练操作之后, 本章将带领读者学习在 Linux 中进行 C 语言编程的基本技能 学习了本章后, 读者能够掌握如下内容 熟悉 Linux 系统下的开发环境熟悉 Vi 的基本操作熟练 Emacs 的基本操作熟悉 Gcc 编译器的基本原理熟练使用

More information

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指 内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指 导 你 搭 建 Linux 平 台 下 的 JAVA 开 发 环 境, 包 括 JDK 以 及 集

More information

Eclipse C C++, or

Eclipse C C++,  or Eclipse C C++, Emailctchen@pl.csie.ntut.edu.tw or s1669021@ntut.edu.tw, s2598003@ntut.edu.tw http://pl.csie.ntut.edu.tw/~ctchen, http://www.ntut.edu.tw/~s2598003/ 2004/9/10 (0.02 ) Eclipse http://www.eclipse.org

More information

前言 GNU Tools 简介小结和作业.... Linux 操作系统分析 2 GNU 开发工具链简介 陈香兰 苏州研究院中国科学技术大学 Spring 陈香兰 (xlanche

前言 GNU Tools 简介小结和作业.... Linux 操作系统分析 2 GNU 开发工具链简介 陈香兰  苏州研究院中国科学技术大学 Spring 陈香兰 (xlanche 2 GNU 开发工具链简介 陈香兰 (xlanchen@ustceducn) 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 Spring 2010 陈香兰 (xlanchen@ustceducn) 工欲善其事, 必先利其器 -- 论语 陈香兰 (xlanchen@ustceducn) Outline 1 2 GNU Tools 简介 3 小结和作业 陈香兰 (xlanchen@ustceducn)

More information

第3章、Linux下C编程基础

第3章、Linux下C编程基础 第 3 章 Linux 下 C 编 程 基 础 本 章 目 标 本 章 将 带 领 读 者 学 习 在 Linux 中 进 行 C 语 言 编 程 的 基 本 技 能 学 习 了 本 章 后, 读 者 能 够 掌 握 如 下 内 容 熟 悉 Linux 系 统 下 的 开 发 环 境 熟 悉 vi 的 基 本 操 作 熟 练 emacs 的 基 本 操 作 熟 悉 gcc 编 译 器 的 基 本 原

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

C

C C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco Windows RTEMS 1 Danilliu MMI TCP/IP 80486 QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos ecos Email www.rtems.com RTEMS ecos RTEMS RTEMS Windows

More information

ARM中C和汇编混合编程及示例.doc

ARM中C和汇编混合编程及示例.doc ARM 中 C 和汇编混合编程及示例 在嵌入式系统开发中, 目前使用的主要编程语言是 C 和汇编,C++ 已经有相应的编译器, 但是现在使用还是比较少的 在稍大规模的嵌入式软件中, 例如含有 OS, 大部分的代码都是用 C 编写的, 主要是因为 C 语言的结构比较好, 便于人的理解, 而且有大量的支持库 尽管如此, 很多地方还是要用到汇编语言, 例如开机时硬件系统的初始化, 包括 CPU 状态的设定,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE Project Properties IDE makefile 1. Oracle Solaris Studio 12.2 IDE 2010 9 2 8 9 10 11 13 20 26 28 30 32 33 Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1. "File" > "New

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

プログラムの設計と実現II

プログラムの設計と実現II UNIX C ls mkdir man http://www.tj.chiba-u.jp/lecture/prog2/ Ctrl+x, Ctrl+s ( )..[4]% gcc Wall o hoge hoge.c..[5]%./hoge 1 : 1 2 : 2 3 : 3 4 : 0 6..[6]% (! )..[4]% gcc Wall o hoge hoge.c..[5]%!g gcc Wall

More information

ebook8-30

ebook8-30 3 0 C C C C C C++ C + + C++ GNU C/C++ GNU egcs UNIX shell s h e l l g a w k P e r l U N I X I / O UNIX shell awk P e r l U N I X C C C C C C U N I X 30.1 C C U N I X 70 C C U N I X U N I X U N I X C Dennis

More information

四 : 断点 (breakpoint) break 命令 ( 可以简写为 b) 可以用来在调试的程序中设置断点, 该命令有如下四种形式 : l break line-number 使程序恰好在执行给定行之前停止 l break function-name 使程序恰好在进入指定的函数之前停止 l br

四 : 断点 (breakpoint) break 命令 ( 可以简写为 b) 可以用来在调试的程序中设置断点, 该命令有如下四种形式 : l break line-number 使程序恰好在执行给定行之前停止 l break function-name 使程序恰好在进入指定的函数之前停止 l br 一 : 列文件清单 1. List (gdb) list line1,line2 GDB 调试精粹及使用实例 二 : 执行程序要想运行准备调试的程序, 可使用 run 命令, 在它后面可以跟随发给该程序的任何参数, 包括标准输入和标准输出说明符 (< 和 >) 和外壳通配符 (*? [ ]) 在内 如果你使用不带参数的 run 命令,gdb 就再次使用你给予前一条 run 命令的参数, 这是很有用的

More information

EK-STM32F

EK-STM32F STMEVKIT-STM32F10xx8 软 件 开 发 入 门 指 南 目 录 1 EWARM 安 装... 1 1.1 第 一 步 : 在 线 注 册... 1 1.2 第 二 步 : 下 载 软 件... 2 1.3 第 三 步 : 安 装 EWARM... 3 2 基 于 STMEVKIT-STM32F10xx8 的 示 例 代 码 运 行... 6 2.1 GPIO Demo... 6 2.2

More information

ebook35-2

ebook35-2 2 2.1 Linux login Login: < > Password: < > Linux r o o t l o g o u t 2.2 Linux X Window Linux Linux Bourne ( b s h ) C ( c s h ) Korn ( k s h ) Bourne Steven Bourne UNIX Bourne bash Bourne C Bill Joy Bourne

More information

02

02 Thinking in C++: Volume One: Introduction to Standard C++, Second Edition & Volume Two: Practical Programming C++ C C++ C++ 3 3 C C class C++ C++ C++ C++ string vector 2.1 interpreter compiler 2.1.1 BASIC

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "P

Oracle Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE P Oracle Solaris Studio 12.3 IDE 2011 12 E26461-01 2 7 8 9 9 Oracle 10 12 14 21 26 27 29 31 32 33 Oracle Solaris Studio IDE makefile C C++ Fortran makefile IDE Solaris Linux C/C++/Fortran Oracle IDE "Project

More information

闖 關 組 4. 任 一 隊 員 曾 獲 得 第 一 屆 第 2 次 全 國 大 專 ITSA 盃 程 式 設 計 桂 冠 挑 戰 大 賽 菁 英 組 前 三 名 或 歷 屆 全 國 大 專 ITSA 盃 程 式 設 計 桂 冠 挑 戰 大 賽 挑 戰 組 前 三 名 應 報 此 組 5. 任 一

闖 關 組 4. 任 一 隊 員 曾 獲 得 第 一 屆 第 2 次 全 國 大 專 ITSA 盃 程 式 設 計 桂 冠 挑 戰 大 賽 菁 英 組 前 三 名 或 歷 屆 全 國 大 專 ITSA 盃 程 式 設 計 桂 冠 挑 戰 大 賽 挑 戰 組 前 三 名 應 報 此 組 5. 任 一 第 五 屆 全 國 大 專 ITSA 盃 程 式 設 計 桂 冠 挑 戰 大 賽 競 賽 須 知 一 辦 理 目 的 : 教 育 部 為 培 育 全 國 大 專 校 院 資 訊 軟 體 人 才, 特 推 動 資 通 訊 軟 體 創 新 人 才 推 升 計 畫, 並 建 置 程 式 設 計 e-tutor 服 務 平 臺 及 PTC 競 賽 練 習 平 台, 由 教 授 專 家 組 成 命 題 團 隊,

More information

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

MPI编译环境的使用

MPI编译环境的使用 .. MPI 编译环境的使用 李会民 hmli@ustc.edu.cn 中国科学技术大学超级运算中心 2011 年 10 月 李会民 ( 中国科大超算中心 ) MPI 编译环境的使用 2011 年 10 月 1 / 17 .1 MPI 编译环境简介.2 MPICH MVAPICH MVAPICH2 Open MPI 等 MPI 编译环境.3 IBM PE MPI 并行环境.4 联系信息 李会民 (

More information

嵌入式操作系统 2 GNU( 交叉 ) 开发工具链简介 陈香兰 苏州研究院中国科学技术大学 Fall 2014 November 28,

嵌入式操作系统 2 GNU( 交叉 ) 开发工具链简介 陈香兰  苏州研究院中国科学技术大学 Fall 2014 November 28, 嵌入式操作系统 2 GNU( 交叉 ) 开发工具链简介 陈香兰 (xlanchen@ustceducn) 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 Fall 2014 November 28, 2014 陈香兰 (xlanchen@ustceducn) ( 计算机应用教研室 @ 计算机学院嵌入式系统实验室嵌入式操作系统 @ 苏州研究院中国科学技术大学 November

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

Linux服务器构建与运维管理

Linux服务器构建与运维管理 1 Linux 服务器构建与运维管理 第 2 章 :Linux 基本命令 阮晓龙 13938213680 / rxl@hactcm.edu.cn http://linux.xg.hactcm.edu.cn http://www.51xueweb.cn 河南中医药大学管理科学与工程学科 2018.3 2 提纲 目录与文件的操作 mkdir touch mv cp rm rmdir file tree

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

附录J:Eclipse教程

附录J:Eclipse教程 附 录 J:Eclipse 教 程 By Y.Daniel Liang 该 帮 助 文 档 包 括 以 下 内 容 : Eclipse 入 门 选 择 透 视 图 创 建 项 目 创 建 Java 程 序 编 译 和 运 行 Java 程 序 从 命 令 行 运 行 Java Application 在 Eclipse 中 调 试 提 示 : 在 学 习 完 第 一 章 后 使 用 本 教 程 第

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

Slide 1

Slide 1 基本编译和纠错 吴宏文 hongwenwu@cn.ibm.com IBM STG Lab Services and Training 1 目录 AIX 上编译介绍 MPI 编译运行介绍 一般程序的纠错 2 一般编译过程 源文件 source 编译 目标文件 object 连接 可执行文件 exe 执行 3 一般编译过程 Unix 系统中, 可执行文件没有统一的后缀, 系统从文件的属性来区分可执行文件和丌可执行文件

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

如何生成库文件 (MDK 和 IAR) 问题 : 该问题由某客户提出, 主要是想自己做一个库给第三方, 但是又不想让别人得到源代码, 不知道如何去做, 尝试了几种办法, 发现都会有些问题. 调研 : 目前 ST 已经提供了各种开源的库文件 ( 如 USB/Ethernet 等等 ), 但是部分客户依

如何生成库文件 (MDK 和 IAR) 问题 : 该问题由某客户提出, 主要是想自己做一个库给第三方, 但是又不想让别人得到源代码, 不知道如何去做, 尝试了几种办法, 发现都会有些问题. 调研 : 目前 ST 已经提供了各种开源的库文件 ( 如 USB/Ethernet 等等 ), 但是部分客户依 如何生成库文件 (MDK 和 IAR) 问题 : 该问题由某客户提出, 主要是想自己做一个库给第三方, 但是又不想让别人得到源代码, 不知道如何去做, 尝试了几种办法, 发现都会有些问题. 调研 : 目前 ST 已经提供了各种开源的库文件 ( 如 USB/Ethernet 等等 ), 但是部分客户依然有使用 IDE 生成可加密的库文件的需求, 因各种 IDE 之间在生成库的方法上有些不同, 调用的方式也有细微的差别,

More information

Date: :32:44 若要重复运行上面的命令, 也可以在调试程序的提示符处按 E n t e r 键 Date: :35:25 若要设置断点, 必须在程序中选定一个要停止运行的位置 命令 l 用于列出程序的下面 1 0 行 再次键 l, 可以列出下面的

Date: :32:44 若要重复运行上面的命令, 也可以在调试程序的提示符处按 E n t e r 键 Date: :35:25 若要设置断点, 必须在程序中选定一个要停止运行的位置 命令 l 用于列出程序的下面 1 0 行 再次键 l, 可以列出下面的 Summary of Comments on ebook65-12 Page: 1 Date: 2001-8-5 21:25:15 P e r l 的 - d 开关可使 P e r l 以调试方式启动运行 命令行上也指明了被调试的程序 Page: 2 Date: 2001-8-5 21:26:01 每当调试程序向你显示程序中的一个语句时, 它就是准备要执行的语句, 而不是上一个运行的语句 Date:

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378> 第 1 部分 Visual Studio 6.0 开发环境介绍 本书以 Visual C++ 6.0 作为 C 源程序的实践开发环境, 本章将首先介绍 Visual C++ 6.0 环境的基本操作, 包括 Visual C++ 6.0 的安装和启动,C 源程序的编辑 运行与调试 1.1 安装与启动 Visual C++ 6.0 MSDN Visual C++ 6.0 1.1 Microsoft Visual

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

Microsoft Word - TASK1-LAB4-AUTOtools.doc

Microsoft Word - TASK1-LAB4-AUTOtools.doc GNU autotools 1. 介绍大部分时候, 你从网上下载了一个开放源代码的软件, 在解压后, 你一般会敲入以下三个命令来编译和安装你的程序 : 1)./configure 2) make 3) make install 其中,configure 脚本分析你的系统以找到合适的工具和库,make 是真正用来编译构建软件的工具,make install 来安装软件 在开放源代码世界,configure

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 177 [P179] (1) - [P181] [P182] (2) - for [P183] (3) - switch [P184] [P187] [P189] [P194] 178 [ ]; : : int var; : int var[3]; var 2293620 var[0] var[1] 2293620

More information

2/14 Buffer I12, /* x=2, buffer = I 1 2 */ Buffer I243, /* x=34, buffer = I 2 43 */ x=56, buffer = I243 Buffer I243I265 code_int(int x, char *buffer)

2/14 Buffer I12, /* x=2, buffer = I 1 2 */ Buffer I243, /* x=34, buffer = I 2 43 */ x=56, buffer = I243 Buffer I243I265 code_int(int x, char *buffer) 1/14 IBM Rational Test RealTime IBM, 2004 7 01 50% IBM Rational Test RealTime IBM Rational Test RealTime 1. 50% IBM Rational Test RealTime IBM Rational Test RealTime 2. IBM Rational Test RealTime Test

More information

软件自由法律中心 GPL 软件许可证合规指导

软件自由法律中心 GPL 软件许可证合规指导 GPL Eben Moglen Mishi Choudhary 2015 8 21 GNU GPL 3 W 3 Copyleft............................... 3 Copyleft 4................................ 7 GPLv2.................................... 7 GPLv3....................................

More information

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i 2013.12.8 7.4 修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 2013.12.1 6.12 下面是一个 C 语言程序 : long f1( i ) long i; { return(i 10); long f2(long i) { return(i

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0

六域链联盟 SDChain-Matrix 节点搭建指南 2018/07/26 Version : 1.0.0 SDChain-Matrix 节点搭建指南 目录 1 环境要求... 3 2 软件下载... 4 3 安装部署... 4 3.1 部署可执行程序目录... 4 3.2 部署配置文件目录... 4 3.3 部署数据库文件目录... 4 3.4 部署日志文件目录... 4 3.5 部署依赖库文件目录... 4 4 配置参数... 5 5 启动运行... 7 5.1 普通模式启动... 7 5.2 加载启动模式...

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

sql> startup mount 改变数据库的归档模式 sql> alter database archivelog # 打开数据库 sql> alter database open 禁止归档模式 sql> shutdown immediate sql>startup mount sql> al

sql> startup mount 改变数据库的归档模式 sql> alter database archivelog # 打开数据库 sql> alter database open 禁止归档模式 sql> shutdown immediate sql>startup mount sql> al RMAN sql> sqlplus / as sysdba 查看数据库版本 sql> select * from v$version; 查看数据库名称 sql> show parameter db_name; 一 使用 RMAN 时, 需要将数据库设置成归档模式 sql> conn / as sysdba; sql> show user 查看数据库是否为归档模式 sql> archive log list

More information

IBM Rational ClearQuest Client for Eclipse 1/ IBM Rational ClearQuest Client for Ecl

IBM Rational ClearQuest Client for Eclipse   1/ IBM Rational ClearQuest Client for Ecl 1/39 Balaji Krish,, IBM Nam LeIBM 2005 4 15 IBM Rational ClearQuest ClearQuest Eclipse Rational ClearQuest / Eclipse Clien Rational ClearQuest Rational ClearQuest Windows Web Rational ClearQuest Client

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

第 4 章 Linux shell 程序设计 shell UNIX/Linux Linux shell shell if case while for shell Linux Linux 本章主要介绍 Linux shell( 默认是 bash) 的语法结构 变量定义及赋值引用 标点符号 控制语句等

第 4 章 Linux shell 程序设计 shell UNIX/Linux Linux shell shell if case while for shell Linux Linux 本章主要介绍 Linux shell( 默认是 bash) 的语法结构 变量定义及赋值引用 标点符号 控制语句等 第 4 章 Linux shell 程序设计 shell UNIX/Linux Linux shell shell if case while for shell Linux Linux 本章主要介绍 Linux shell( 默认是 bash) 的语法结构 变量定义及赋值引用 标点符号 控制语句等 本章的主要内容如下 : shell 的主要特点 类型 建立和执行方式 bash 变量的分类 定义形式及引用规则

More information

投影片 1

投影片 1 類 Linux BASH shell (, VBird) 2008/03/29 Linux 1 Bash Shell 令 vi vim 料流 令 / 令 理 (job control) 例 2008/03/29 Linux 2 Bash shell 2008/03/29 Linux 3 什 Shell Shell shell 2008/03/29 Linux 4 什 Shell Linux shell

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

嵌入式Linux培训免费讲座

嵌入式Linux培训免费讲座 The success's road 嵌入式 Linux 开发流程 李亚锋 www.farsight.com.cn 内容概要 v 传统桌面开发和嵌入式开发 v 嵌入式 Linux 开发步骤 v 嵌入式 Linux 常见的开发工具 v 嵌入式 Linux 常见的调试工具 v 如何入门 v 传统桌面开发和嵌入式开发 v 嵌入式 Linux 开发步骤 v 嵌入式 Linux 常见的开发工具 v 嵌入式 Linux

More information

Microsoft Word - 第3章 vi与Emacs编辑器.docx

Microsoft Word - 第3章 vi与Emacs编辑器.docx Linux C 编程从初学到精通 作者 : 华清远见 第 3 章 vi 与 Emacs 编辑器 本章目标 文本编辑器是计算机最基本的应用, 修改配置文件 编写程序或者建立文件都需要用到它 Linux 提 供了齐全的文本编辑器, 可以让用户按照自己的喜好进行选择 在 Linux 众多的文本编辑器中,vi 和 Emacs 编辑器是 Linux 用户最为普遍的选择 本章将向读者介绍这两种文本编辑器 本章内容

More information

C/C++ - 字符串与字符串函数

C/C++ - 字符串与字符串函数 C/C++ Table of contents 1. 2. 3. 4. 1 char C 2 char greeting [50] = " How " " are " " you?"; char greeting [50] = " How are you?"; 3 printf ("\" Ready, go!\" exclaimed John."); " Ready, go!" exclaimed

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc Java C++ Pascal C# C# if if if for while do while foreach while do while C# 3.1.1 ; 3-1 ischeck Test() While ischeck while static bool ischeck = true; public static void Test() while (ischeck) ; ischeck

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information