嵌入式Linux相关_linux上的CC++编译器和调试器个个数
### 嵌入式Linux中的C/C++编译器与调试器详解 #### GCC/EGCS:嵌入式Linux下的核心工具链 在嵌入式Linux开发领域,编译器和调试器是不可或缺的重要工具。其中,GCC(GNU Compiler Collection)作为C/C++语言的标准编译器,在Linux平台及嵌入式系统中被广泛使用。GCC不仅支持多种编程语言,如C、C++、Fortran等,而且提供了丰富的选项来满足不同的编译需求。 ### 1. GCC详解 #### 1.1 GCC的使用示例 GCC能够同时处理C和C++源代码,通过简单的命令行参数即可完成不同类型的编译任务。以下是一个简单的例子,展示了如何使用GCC编译一个计算阶乘的程序: 1. **源文件定义** - `factorial.c` 文件包含了计算阶乘的函数。 - `main.c` 文件则是程序的入口点,负责调用阶乘函数并打印结果。 2. **源文件内容** ```c // factorial.c #include <stdio.h> #include <stdlib.h> int factorial(int n) { if (n <= 1) return 1; else return factorial(n - 1) * n; } ``` ```c // main.c #include <stdio.h> #include <stdlib.h> int factorial(int n); int main(int argc, char** argv) { int n; if (argc < 2) { printf("Usage: %s n\n", argv[0]); return -1; } else { n = atoi(argv[1]); printf("Factorial of %d is %d.\n", n, factorial(n)); } return 0; } ``` 3. **编译与执行** 使用以下命令编译程序: ```bash gcc -o factorial main.c factorial.c ``` 执行程序: ```bash ./factorial 5 ``` 输出结果为: ``` Factorial of 5 is 120. ``` #### 1.2 GCC的扩展能力 GCC同样可以处理C++源代码,对于C++文件通常以`.cpp`或`.C`作为扩展名。例如,编译一个简单的C++程序: ```c++ // hello.C #include <iostream> using namespace std; void main(void) { cout << "Hello, world!" << endl; } ``` 编译过程如下: ```bash g++ -o hello hello.C ``` 执行程序: ```bash ./hello ``` 输出结果为: ``` Hello, world! ``` 这里需要注意的是,如果源文件为C++,则建议使用`g++`而非`gcc`进行编译,以确保正确处理C++特有的语法和特性。 ### 2. GCC编译选项 GCC提供了一系列强大的编译选项,用于控制编译过程的不同方面,包括但不限于标准选择、预处理器指令、优化等级等。以下是一些常用的GCC编译选项: - `-ansi`:仅支持ANSI C标准,这将禁止GCC的一些扩展特性。 - `-c`:仅生成目标文件。 - `-DMACRO`:定义宏`MACRO`。 - `-E`:只执行预处理步骤。 - `-g`:生成调试信息。 - `-IDIRECTORY`:指定包含文件的目录。 - `-LDIRECTORY`:指定库文件的搜索路径。 - `-lLIBRARY`:链接指定的库。 - `-m486`:指定针对486处理器的优化。 - `-o FILE`:指定输出文件的名称。 - `-O0`至`-O3`:设置不同的优化级别。 - `-shared`:生成共享库。 - `-static`:静态链接。 - `-w`:抑制所有警告信息。 - `-W`:开启额外的警告信息。 ### 3. GDB:调试器的使用 GDB(GNU Debugger)是GNU项目提供的调试工具,它允许用户以交互的方式检查和修改程序状态,帮助开发者找到程序中的错误。GDB支持多种操作模式,可以在文本界面下运行,也可以通过图形用户界面(GUI)进行操作。 #### 3.1 GDB的基本功能 GDB的主要功能包括但不限于: - **断点管理**:设置、删除和列出断点。 - **数据查看**:查看变量值和内存内容。 - **程序控制**:单步执行、继续执行和终止程序。 - **堆栈跟踪**:查看函数调用堆栈。 - **状态查询**:显示当前调试状态。 #### 3.2 GDB的常用命令 - `break NUM`:在第`NUM`行设置断点。 - `bt`:显示当前的函数调用堆栈。 - `clear`:清除断点。 - `continue`:继续执行程序。 - `display EXPR`:显示表达式的值。 - `file FILE`:加载可执行文件。 - `help NAME`:显示帮助信息。 - `info breakpoints`:显示已设置的断点信息。 - `info files`:显示当前加载的文件列表。 - `info functions`:显示当前程序中的函数列表。 - `info locals`:显示局部变量的信息。 - `info prog`:显示当前程序的状态。 - `info var`:显示全局变量的信息。 - `kill`:终止程序的执行。 - `list`:显示源代码。 - `next`:单步执行到下一行源代码。 ### 4. 实战案例:使用GDB调试程序 下面以一个简单的C程序为例,演示如何使用GDB进行调试: 1. **源文件内容** (`bugging.c`) ```c #include <stdio.h> #include <string.h> static char buff[256]; static char* string; int main() { printf("Please input a string:\n"); gets(string); // 安全隐患:`gets()`函数可能导致缓冲区溢出 printf("Your string is: %s\n", string); } ``` 2. **编译与调试** 编译时加入调试信息: ```bash gcc -o test -g bugging.c ``` 使用GDB调试: ```bash gdb ./test ``` 设置断点并执行程序: ```bash break main run ``` 输入字符串并观察程序行为: ```bash continue ``` 查看局部变量的状态: ```bash print string ``` 此案例中,我们可以通过GDB发现并定位`gets()`函数可能带来的安全问题,从而对程序进行相应的修复。 GCC和GDB作为嵌入式Linux开发中不可或缺的工具,为开发者提供了强大的编译和调试功能。熟练掌握这些工具的使用方法,对于提高开发效率、确保代码质量具有重要意义。
linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。
#DEMO#: hello.c
如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执行文件。例如,假设你有
两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。
清单 factorial.c
-----------------------
#include
#include
int factorial (int n)
{
if (n <= 1)
return 1;
else
return factorial (n - 1) * n;
}
-----------------------
-----------------------
清单 main.c
-----------------------
#include
#include
int factorial (int n);
{
int n;
if (argc < 2) {
printf ("Usage: %s n ", argv [0]);
return -1;
}
else {
n = atoi (argv[1]);
printf ("Factorial of %d is %d. ", n, factorial (n));
}
return 0;
}
-----------------------
利用如下的命令可编译生成可执行文件,并执行程序:
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.
GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C+
+ 程序。在 linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。
但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完
完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。
假设我们有一个如下的 C++ 源文件(hello.C):
#include
void main (void)
剩余5页未读,继续阅读
- 粉丝: 26
- 资源: 631
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2011-2024年各省数字普惠金融指数数据.zip
- 数据结构排序算法:插入排序、希尔排序、冒泡排序及快速排序算法
- Nosql期末复习资料
- Python新年庆典倒计时与节日活动智能管理助手
- 塑料、玻璃、金属、纸张、木材检测36-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 系统DLL文件修复工具
- 数据结构之哈希查找方法
- Python圣诞节倒计时与节日活动管理系统
- 塑料检测23-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- PPT模板WHUT-博学之光-PPT模板
- C#上位机开发与工控通讯实战课程
- HCIA-Datacom教师笔记-数据通信基础知识及网络模型详解
- MobileNet V2 网络实现的计算机视觉大项目:8种常见茶叶病害种类识别
- 文件格式是一种撒很快的哈的东西
- Python之正则表达式基础知识
- JLINK-OB下载器的原理图和HEX文件