zoukankan      html  css  js  c++  java
  • 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用来测试,最后解决了。

  • 相关阅读:
    我是新手,我在学Android
    WAMP环境下(apache2.2.21+Php5.3.10)编写PHP扩展
    java中三种字符串正则匹配方式
    PHP扩展开发过程中的问题
    Android错误解决方法之:Debug certificate expired on
    Ubuntu下C++开发PHP开发扩展的注意事项
    我的笔试题
    很多时候,是否好好看完一本好书,对一个人的提升往往能达到质的区别
    C语言常用宏定义
    Linux下用C++开发PHP扩展
  • 原文地址:https://www.cnblogs.com/BillGreen/p/15340546.html
Copyright © 2011-2022 走看看