Linux C语言编程基础

Linux C语言编程

任务要求

  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分)

程序编写

  • 我选择2.10,在OpenEuler中进行了链表相关C程序的编程练习

"type.h"

    #ifndef __TYPE_H__
    #define __TYPE_H__

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define N 10
    typedef struct node{
      struct node *next;
      int id;
      char name[64];
    }NODE;
  
    #endif

practice.c 创建并打印一个链表

#include "type.h"

NODE *mylist, node[N];

static int printlist(NODE *p)
{
  while(p){
    printf("[%s %d]->",p->name,p->id);
    p=p->next;
  }
  printf("NULL\n");
}

static int main()
{
  int i;
  NODE *p;
  for(i=0;i<N;i++){
    p = &node[i];
    sprintf(p->name,"%s%d","node",i);
    p->id=i;
    p->next=p+1;
  }
  node[N-1].next = 0;
  mylist = &node[0];
  printlist(mylist);
}

项目目录

  • 项目名称 20191302project

gcc相关练习

  • 生成文件

静态库与动态库制作

  • 静态库制作
    gcc src/practice.c -Iincluede -Llibs -lpractice -o bin/practice
  • 动态库制作
    gcc -shared -o libpractice.so libs/practice.o
  • libs目录

gdb相关练习

  • 断点设置
    • b 函数名 设置函数断点
    • b 行数 设置行断点
    • b 行数 if i==2 设置条件断点
    • tb 函数 设置临时断点
  • 调试
    • r 运行
    • s 单步运行
    • n 单步运行 跳过函数内断点

makefile编写

OBJ:libs/libpractice.so libs/libpractice.a bin/practice
  
bin/practice: libs/practice.o src/practice.c
        gcc src/practice.c -Iinclude libs/practice.o -o bin/practice
libs/libpractice.a: libs/*.o
        ar rcs libs/libpractice.a libs/*.o
libs/libpractice.so: libs/*.o
        gcc -shared -o libs/libpractice.so libs/*.o

问题与解决

  • 在运行时,出现了下图所示的报错问题:
  • 解决通过课上所学结合网上查找,得知问题出在重复编译了函数,解决方法是在函数前加上static变为静态全局变量,问题得到解决。
posted @ 2021-09-25 13:59  20191302董佳帅  阅读(52)  评论(0编辑  收藏  举报
/* 看板娘 */