Linux C语言编程基础
Linux C语言编程基础
作者:20191322
目录
任务详情
- 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分)
- 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2.13,2.14任选一个)
- 建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include, bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构,提交截图(5分)
- 进行gcc相关练习(ESc, iso, -I等)提交相关截图(5分)
- 进行静态库,动态库制作和调用练习,提交相关截图(5分)
- 进行gdb相关练习,至少包含四种断点的设置,提交相关截图(10分)
- 编写makefile(5分)
实践过程
本次实践采用OpenEuler系统,安装教程请看我这一篇博客,图形化界面安装请看我这一篇博客
本次实践内容为2.12.2 构建二叉搜索树
-
建立自己的项目目录
-
编写需要用到的模块
头文件(用于新建一个节点)
btree.h,用于结构体定义以及节点初始化
代码如下:
#ifndef __BTREE_H__ #define __BTREE_H__ typedef struct node { int key; struct node *left, *right; }NODE; #endif
模块
insert.c:通过遍历的方式创建二叉搜索树
代码如下:
include <stdio.h> #include <stdlib.h> #include "btree.h" NODE *insert(NODE *node,int key) { if (node == NULL) { NODE *node = (NODE *)malloc (sizeof(NODE)); node->key = key; node->left = node->right = NULL; return node; } if (key < node->key) node->left = insert(node->left,key); else if (key > node->key) node->right = insert(node->right,key); return node; }
主函数
#include <stdio.h> #include "btree.h" int main() { int N = 7; int nodeValue[7] = {50,30,20,40,70,60,80}; int i; NODE *root = NULL; root = insert(root,nodeValue[0]); for(i = 1;i<N;i++) { insert(root,nodeValue[i]); } printf("ok"); }
-
gcc练习
使用之前编写的hello.c进行试验
-
-E
gcc -E 预处理.c 文件,生成.i文件
-
-S
编译代码,得到汇编代码,.s文件
-
-C
-
链接代码,生成.o文件。二进制
-
静态库制作
使用命令
gcc -c src/*.c -Iinclude -o lib/*.o
生成.o文件,再使用ar rcs lib/libBSTree.a lib/*.o
就可以生成静态库了 -
动态库制作
-
makefile编写
20191322wyl: lib/test.o lib/insert.o
OBJ: bin/test lib/libinsert.a lib/libinsert.so
bin/test: test/test.c lib/libinsert.a
gcc test/test.c -static -Iinclude -Llib -linsert -o bin/test
lib/libinsert.a:$(o)
ar rcs lib/libiinsert.a $(o)
lib/libinsert.so:$(o)
gcc -shared -o lib/libinsert.so $(o)
-
查看项目目录
-
gdb练习
4种断点:行断点、函数断点、条件断点、临时断点。
- 函数断点 b main()
- 行断点 b 4
- 临时断点 tb 4
- 条件断点 break 行号 if 条件
问题与解决
问题:
生成动态库时报错
解决方案:
网上查了查说是头文件重复定义,然后猜测是因为在btree头文件中使用了malloc但是btree头文件中没有引入strlib.h文件
将insert.h头文件写成一个模块,用来创建二叉树,然后写一个test.c用来测试,最后解决了。