Linux下的Makefile的简单使用(简单粗暴)

本文介绍了Makefile的基础知识,包括其在大型项目编译中的重要性及通用结构,并通过一个简单的示例展示了如何使用Makefile简化编译过程,提高开发效率。

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

Makefile的简介

Makefile 是和 make 命令一起配合使用的.
很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂.
Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些日常操作. 这个需要大家发挥自己的想象力.

Makefile的通用结构

# 以‘#’开头的行表示注释

#定义变量VAR,强制赋值为test
VAR=test

#在VAR之前定义的值后面再追加app这个值,这时该变量值扩展为testapp
VAR+=app

#如果之前VAR没有被定义,则定义并使用testapp;否则使用之前的值。
VAR?=testapp

#第一条目标为总的目标
#依赖可以是文件(目录)或为其他目标
#动作可以是Linux命令,动作的那一行必须以TAB键开头
target: depend1 depend2 depend3 …
【TAB】 action1
【TAB】action2

target1;
【TAB】action1
【TAB】action2

Mkfile的简单示例

首先我们需要在linux下创建一个文件夹,里面需要写两个.c文件和一个头文件
hello.c文件代码


#include <stdio.h>
#include "heard.h"

int main (int argc, char **argv)
{
    int a=5;
    int b=6;
    int c;

    c=add(&a,&b);

    printf("%d\n",c);
    printf("hello world\n");
    return 0;
} 

add.c的文件代码

#include <stdio.h>

int add(int *a, int *b);

int add(int *a, int *b) 
{
    int c;
        
   c=(( *a)+( *b));

    return c;
}

heard.h的头文件

int add(int *a, int *b);

在这里插入图片描述
在没有学习makefile之前我们编译的时候需要编译运行的时候需要输入
gcc hello.c gcc add.c -o test
如果我们每次运行都要输入这一行,显得很麻烦,如果我们使用makefile的使用会使这个变得更加简单起来,

vim makefile

#定义变量
APP_NAME= test

cc=gcc

#这里的all是整个makefile文件的第一个目标,也就是总的目标,当我们输入make的命令时就是完成这个目标
all:
    ${cc} add.c hello.c -o ${APP_NAME}

#clean是一个单独的目标,该目标没有被总的目标all依赖或执行,所以默认该目标不会被执行,如果想执行该目标,则可以在Linux命令行下输入make clean来执行
clean:
    rm -f ${APP_NAME}

当我们敲make的时候,就完成没有学makefile的操作。
在这里插入图片描述
当我们敲make clean的时候,test就会被删除
在这里插入图片描述
上面所讲到的东西都是关于makefile的简单使用,如果想要了解更多知识点,可以推荐大家一篇博客,供大家学习
Makefile的详细介绍

### 编译器错误分析 当遇到 `command 'x86_64-linux-gnu-g++' failed with error 'No such file or directory'` 的问题时,通常是因为开发环境中缺少必要的编译工具链或依赖项。以下是可能的原因以及解决方案: #### 原因 1:未安装 GCC 或 G++ 在 Debian 及其衍生发行版(如 Ubuntu)中,默认情况下可能并未完全安装完整的 C/C++ 开发环境。这可能导致无法找到所需的编译器。 **解决方案**: 可以通过以下命令来安装缺失的工具链: ```bash sudo apt-get update sudo apt-get install build-essential ``` 上述命令会安装 GNU Compiler Collection (GCC),其中包括了 `g++` 和其他必需的开发工具[^1]。 --- #### 原因 2:缺少特定架构的支持库 如果目标平台涉及多架构支持,则需要额外安装针对 `x86_64-linux-gnu` 架构的相关库和支持文件。 **解决方案**: 执行以下命令以确保安装了所有必要依赖项: ```bash sudo apt-get install gcc-multilib g++-multilib ``` 这些包提供了跨架构编译所需的支持文件[^2]。 --- #### 原因 3:缺少特定头文件或静态链接库 某些项目在编译过程中可能会调用外部库(例如 OpenSSL、libffi 等)。如果没有正确安装这些库及其对应的开发头文件,也会引发类似的错误。 **解决方案**: 根据具体的编译需求,安装相应的开发库。常见的有: ```bash sudo apt-get install libssl-dev libffi-dev libsasl2-dev ``` 对于更复杂的场景,还可以考虑安装通用数学库支持: ```bash sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev ``` 如果有 Python 组件参与编译过程,还需要确认已安装对应版本的 Python 头文件: ```bash sudo apt-get install libpython3.8-dev ``` 注意替换 `3.8` 为实际使用的 Python 版本号[^4]。 --- #### 原因 4:路径配置不正确 有时即使已经安装了相关软件包,但由于 PATH 环境变量设置不当或者编译脚本中的硬编码路径冲突,仍会出现找不到指定工具的情况。 **临时解决办法**: 手动创建一个占位符文件让编译器跳过检测阶段: ```bash touch /usr/bin/x86_64-linux-gnu-g++ chmod +x /usr/bin/x86_64-linux-gnu-g++ ``` 这种方法虽然简单粗暴但能快速验证是否属于单纯命名匹配失败引起的问题[^5]。 另一种方式则是调整 Makefile 或者 setup.py 文件内的 CC/CXX 参数定义部分,显式指向系统中存在的真实可执行二进制位置。 --- ### 总结建议流程 1. 更新并升级 APT 软件源列表; 2. 安装基础构建套件(build-essential); 3. 补充多架构交叉编译能力(gcc/g++-multilib); 4. 额外加载项目依赖的具体动态/静态库资源(libxxx-dev系列); 5. 若以上均无效再尝试伪造目标程序期待发现却不存在的实际实体对象实例(touch trick). 通过逐步排查上述几个方面应该能够有效定位并最终消除该类编译期异常状况的发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值