Linux C语言编程
任务要求
- 基于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分)
程序编写
- 我选择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变为静态全局变量,问题得到解决。