gcc编译多个函数文件的Makefile写法(单链表的插入和合并等功能)

本文介绍了一个基于单链表的数据结构实现,包括插入、打印及合并功能,并通过Makefile进行编译链接。该程序使用C语言编写,涉及结构体定义、函数实现及依赖管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  部分源程序参考了华清远见的《嵌入式Linux C编程入门》(第2版)P231,实现的功能是单链表的插入和合并功能,Makefile是自己编写的,以便将几个子函数一起弄过来编译链接。

  Makefile文件

OBJS = main.o init.o ListInsert.o printlist.o MergeList.o
main : $(OBJS) 
    gcc  $(OBJS) -o main
main.o : main.c include.h
    gcc -g -c main.c -o main.o
init.o : init.c 
    gcc -g -c init.c -o init.o
ListInsert.o : ListInsert.c 
    gcc -g -c {1}lt; -o $@
printlist.o : printlist.c 
    gcc -g -c {1}lt; -o $@
MergeList.o : MergeList.c 
    gcc -g -c {1}lt; -o $@
clean :
    rm main $(OBJS)

  main.c文件

#include"include.h"
main()
{   struct STU e;
    LinkList La,Lb,Lc;
    printf("\n\n-------------List Demo is running...-------------\n\n");
    /*Init the first LinkList*/
    init(&La);
    /*Insert the first element to the first LinkList*/
    strcpy(e.name,"stu1");
    strcpy(e.stuno,"100001");
    e.age = 80;
    e.score = 1000;
    ListInsert(La,1,e);
    /*Insert the second element to the first LinkList*/
    strcpy(e.name,"stu3");
    strcpy(e.stuno,"100002");
    e.age = 80;
    e.score = 1000;
    ListInsert(La,2,e);
    printlist(La);  //print La
    getchar();
    /*Init the second LinkList*/
    init(&Lb);
    /*Insert the first element to the second LinkList*/
    strcpy(e.name,"stu2");
    strcpy(e.stuno,"100001");
    e.age = 70;
    e.score = 1000;
    ListInsert(Lb,1,e);
    /*Insert the second element to the second LinkList*/
    strcpy(e.name,"stu4");
    strcpy(e.stuno,"100002");
    e.age = 70;
    e.score = 1000;
    ListInsert(Lb,2,e);
    /*Insert the third element to the second LinkList*/
    strcpy(e.name,"stu6");
    strcpy(e.stuno,"100003");
    e.age = 70;
    e.score = 1000;
    ListInsert(Lb,3,e);
    printlist(Lb);
    getchar();

    /*Merge La and Lb*/
    MergeList(La,Lb,&Lc);
    printlist(Lc);
    getchar();
}

  include.h文件

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

/*page 226*/
struct STU 
{   char name[20];
    char stuno[10];
    int age;
    int score;
}stu[50];
typedef struct STU ElemType;

struct LNODE
{   ElemType data;
    struct LNODE *next;
};
typedef struct LNODE LNode,*LinkList;

int init(LinkList *L);
int ListInsert(LinkList L,int i,ElemType e); 
int printlist(LinkList L); 
void MergeList(LinkList La,LinkList Lb,LinkList *Lc);

  init.c文件

#include"include.h"
int init(LinkList *L) 
{   (*L) = (LinkList)malloc(sizeof(LNode));
    if(!L)
        exit(0);
    memset(&((*L)->data),0,sizeof(struct STU));
    (*L)->next = NULL;
    return 1;
}/*init*/

  ListInsert.c文件

#include"include.h"
int ListInsert(LinkList L,int i,ElemType e)
{   LinkList p,s;
    int j;
    p = L;j = 0;
    while(p && j < i-1)
    {   p = p->next;
        ++j;
    }   
    if(!p || j > i-1)
        return 0;
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return 1;
}
  MergeList.c文件

#include"include.h"
void MergeList(LinkList La,LinkList Lb,LinkList *Lc)
{   LinkList pa,pb,pc;
    pa = La->next;pb = Lb->next;
    *Lc = pc = La; 
    while(pa && pb) 
    {   if(Less_EqualList(&pa->data,&pb->data))
        {   pc->next = pa; 
            pc = pa; 
            pa = pa->next;
        }   
        else
        {   pc->next = pb; 
            pc = pb; 
            pb = pb->next;
        }   
        pc->next = pa ? pa : pb; 
        free(La);
        free(Lb);
    }   
}
int Less_EqualList(ElemType *e1,ElemType *e2)
{   if(strcmp(e1->name,e2->name) <= 0)
        return 1;
    else
        return 0;
}

  printlist.c文件

#include"include.h"
int printlist(LinkList L)
{   int i;
    LinkList p;
    p = L;
    printf("name      stuno     age score\n");
    while(p->next)
    {   p = p->next;
        printf("%-10s%s\t%d\t%d\n",p->data.name,p->data.stuno,p->data.age,p->data.score);
    }   
    printf("\n");
}

  大概总结了下写简单Makefile的方法,就是include之类的和一些全局定义的结构体或者变量和函数等要放在同一个.h文件里面,
然后下面每一个子函数都要include进去这个头文件,这下再根据依赖关系就可以写出一个简单的Makefile了。

make结果

运行结果



原创文章,欢迎转载,转载请注明:blog.youkuaiyun.com/jjzhoujun2010

作者:Dream Fly


### 如何使用 GCC 编译 C++ 文件 虽然 `gcc` 主要用于编译 C 语言文件,但它同样能够处理 C++ 文件。当使用 `gcc` 编译 C++ 文件时,它实际上会调用内部的 C++ 编译器来完成任务[^1]。 #### 基本命令结构 以下是使用 `gcc` 编译 C++ 文件的基本语法: ```bash gcc [选项] 输入文件名 -l库名称 (如果需要链接) -o 输出文件名 ``` 对于简单的单个 `.cpp` 文件,可以直接运行以下命令: ```bash gcc your_program.cpp -o your_program ``` 这将会把名为 `your_program.cpp` 的源代码编译成可执行程序 `your_program`[^2]。 #### 添加警告优化选项 为了提高代码质量并捕获潜在错误,在实际开发过程中通常建议加上 `-Wall` 参数启用所有常见警告信息,并可能还需要其他如性能优化之类的标志位。例如: ```bash gcc -Wall your_program.cpp -O2 -o your_program ``` 这里 `-Wall` 表示显示大多数有用的警告消息;而 `-O2` 则指定了一个较高的优化级别[^3]。 #### 链接静态或动态库 如果有外部依赖项,则需指定这些库的位置以及它们的名字。比如假设存在一个叫做 `libexample.a` 或者共享对象形式下的版本即 `libexample.so`, 可通过下面的方式引入该资源: ```bash gcc your_program.cpp /path/to/libexample.a -o your_program # 对于so文件则可能是这样写法 gcc your_program.cpp -L/path/to/libs/ -lexample -o your_program ``` 其中 `/path/to/` 应替换为你自己的路径位置。 #### 使用 G++ 替代 GCC 尽管可以用 `gcc` 来编译 C++ 程序,但由于历史原因推荐尽可能采用专门设计用来支持现代标准特性的 `g++`. 它默认包含了必要的头文件目录设置及启动函数定义等内容使得整个过程更加顺畅: ```bash g++ your_program.cpp -o your_program ``` #### 自动化构建工具——CMake 示例 针对更复杂的项目结构或者跨平台需求场景下考虑利用像 CMake 这样的高级自动化脚本来简化管理工作流程。以 cpp_redis 工程为例说明其具体操作方法如下所示[^4]: 先确保安装好 Git cmake 后再继续下一步骤: 1. 执行克隆仓库指令获取最新版源码包; ```bash git clone --recursive https://gitee.com/l0km/cpp_redis.build.git cd cpp_redis.build/ ``` 2. 创建一个新的子文件夹存放临时生成物并将当前工作区切换过去; ```bash mkdir build && cd build ``` 3. 调用配置阶段生成 Makefile 并随后实施真正的组装动作即可得到最终产物啦! ```bash cmake .. make ``` 以上便是关于如何运用 GNU Compiler Collection 中成员之一 —— gcc 实现对 c plus plus 类型文档转换为目标机器码的知识点总结啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaydenZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值