Linux C语言编程基础

Linux C语言编程基础

作者:20191322

任务详情

  1. 基于Ubuntu或OpenEuler完成下面的任务(OpenEuler有加分)
  2. 选择教材第二章的一节进行编程基础练习(2.10,2.11,2.12,2.13,2.14任选一个)
  3. 建立自己的项目目录,包含自己学号信息(如20190100linkedlist),构建项目结构(src, include, bin, lib, docs, test...),然后把相应代码和文档放置到正确位置,用tree命令查看项目结构,提交截图(5分)
  4. 进行gcc相关练习(ESc, iso, -I等)提交相关截图(5分)
  5. 进行静态库,动态库制作和调用练习,提交相关截图(5分)
  6. 进行gdb相关练习,至少包含四种断点的设置,提交相关截图(10分)
  7. 编写makefile(5分)

实践过程

本次实践采用OpenEuler系统,安装教程请看我这一篇博客,图形化界面安装请看我这一篇博客

本次实践内容为2.12.2 构建二叉搜索树

  1. 建立自己的项目目录

  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");
    }
    
  3. gcc练习

    使用之前编写的hello.c进行试验

    • -E

      gcc -E 预处理.c 文件,生成.i文件

    • -S

      编译代码,得到汇编代码,.s文件

    • -C

链接代码,生成.o文件。二进制

  1. 静态库制作

    使用命令gcc -c src/*.c -Iinclude -o lib/*.o生成.o文件,再使用ar rcs lib/libBSTree.a lib/*.o就可以生成静态库了

  2. 动态库制作

    参考链接

  3. 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)

  1. 查看项目目录

  2. gdb练习

    4种断点:行断点、函数断点、条件断点、临时断点。

    • 函数断点 b main()
    • 行断点 b 4
    • 临时断点 tb 4
    • 条件断点 break 行号 if 条件

问题与解决

问题:

生成动态库时报错

解决方案:

网上查了查说是头文件重复定义,然后猜测是因为在btree头文件中使用了malloc但是btree头文件中没有引入strlib.h文件

将insert.h头文件写成一个模块,用来创建二叉树,然后写一个test.c用来测试,最后解决了。

原文地址:https://www.cnblogs.com/BillGreen/p/15340546.html