GNU make在鸿蒙PC上的使用方法

ohos-make是为 OpenHarmony 平台编译的 GNU make 构建工具。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 make 工具,包括 HNP 包的打包、安装和使用方法。

📋 目录

  • 一、项目概述
  • 二、为什么需要 HNP 包
  • 三、HNP 包打包方法
  • 四、安装与使用
  • 五、使用示例
  • 六、常见问题
  • 七、总结与最佳实践
  • 八、参考资料

一、项目概述

1.1 make 工具简介

make是一个自动化构建工具,通过读取Makefile文件来执行编译、链接、安装等任务。它是 Unix/Linux 系统中最常用的构建工具之一。

核心特性:

  • 🔧自动化构建:根据依赖关系自动执行构建任务
  • 📝简单配置:通过Makefile文件描述构建规则
  • 增量构建:只重新编译修改过的文件
  • 🎯并行构建:支持多任务并行执行
  • 🔄跨平台:支持多种操作系统

主要应用场景:

  • C/C++ 项目的编译和链接
  • 自动化构建流程
  • 依赖管理和任务编排
  • 与 autoconf、CMake 等工具配合使用
  • 软件安装和部署

1.2 项目信息

项目信息详情
项目名称ohos-make
版本4.4.1(GNU make 官方版本)
许可证GPL-3.0
目标平台鸿蒙PC (aarch64-linux-ohos)
源码仓库https://git.savannah.gnu.org/git/make.git
适配仓库https://github.com/Harmonybrew/ohos-make
预构建包https://github.com/Harmonybrew/ohos-make/releases
编译方式交叉编译(Cross Compilation)

1.3 make 构建流程

make 的典型构建流程包括:

  1. 读取 Makefile:解析构建规则和依赖关系
  2. 分析依赖:确定需要重新构建的目标
  3. 执行命令:按照规则执行编译、链接等命令
  4. 更新目标:生成最终的可执行文件或库
Makefile → make → 分析依赖 → 执行命令 → 生成目标

1.4 为什么需要 ohos-make?

在鸿蒙PC上进行开发时,我们经常需要:

  1. 构建 C/C++ 项目:编译和管理 C/C++ 项目
  2. 自动化任务:执行重复性的构建和部署任务
  3. 依赖管理:处理项目间的依赖关系
  4. 与其他工具配合:作为 autoconf、CMake 等工具的后端

二、为什么需要 HNP 包

2.1 系统安全限制

重要说明:在鸿蒙PC上,由于系统安全规格限制等原因,暂不支持通过"解压 + 配 PATH"的方式直接使用 tar.gz 包

这意味着:

  • ❌ 不能直接解压 tar.gz 包到任意目录
  • ❌ 不能通过设置 PATH 环境变量来使用
  • ✅ 必须打包成 HNP(HarmonyOS Native Package)格式才能正常使用

2.2 HNP 包的优势

HNP 包是鸿蒙PC的官方包管理格式,具有以下优势:

  • 系统集成:与鸿蒙PC的包管理系统集成
  • 安全可靠:通过官方工具安装,符合系统安全规范
  • 易于管理:支持安装、卸载、更新等操作
  • 路径规范:统一安装在/data/service/hnp/目录下

2.3 其他平台的使用方式

在鸿蒙开发板上:

  • 可以使用 hdc 推送 tar.gz 包
  • 支持"解压 + 配 PATH"的方式

在鸿蒙容器中:

  • 可以直接下载 tar.gz 包
  • 支持"解压 + 配 PATH"的方式

三、HNP 包打包方法

3.1 准备工作

3.1.1 下载预构建包

首先,从 release 页面 下载官方适配完成的预构建包:

# 下载 make 预构建包wgethttps://github.com/Harmonybrew/ohos-make/releases/download/4.4.1/make-4.4.1-ohos-arm64.tar.gz
3.1.2 解压并查看结构
# 解压 tar.gz 包tar-zxf make-4.4.1-ohos-arm64.tar.gz# 查看目录结构tree make-4.4.1-ohos-arm64/

目录结构示例:

make-4.4.1-ohos-arm64/ ├── bin/ │ └── make # make 可执行文件 └── COPYING # 许可证文件

3.2 创建 HNP 包配置

3.2.1 创建 hnp.json

在解压后的目录中创建hnp.json配置文件:

{"type":"hnp-config","name":"make","version":"4.4.1","install":{"links":[{"source":"bin/make","target":"make"}]}}

配置说明:

  • type: 固定为"hnp-config"
  • name: 包名称(make)
  • version: 版本号(4.4.1)
  • install.links: 安装时的符号链接配置
    • source: 源文件路径(相对于安装目录)
    • target: 链接目标名称(命令名称)
3.2.2 准备安装目录结构

按照 HNP 包的路径规则,准备安装目录:

# HNP 包的路径规则:${HNP_PUBLIC_PATH}/<包名>.org/<包名>_<版本号># 例如:/data/service/hnp/make.org/make_4.4.1exportHNP_PUBLIC_PATH=/data/service/hnpexportMAKE_INSTALL_PATH=${HNP_PUBLIC_PATH}/make.org/make_4.4.1# 创建安装目录mkdir-p${MAKE_INSTALL_PATH}

3.3 打包脚本

3.3.1 方法一:手动打包

创建打包脚本pack_hnp.sh

#!/bin/bashset-e# 配置变量MAKE_VERSION="4.4.1"TAR_FILE="make-${MAKE_VERSION}-ohos-arm64.tar.gz"EXTRACT_DIR="make-${MAKE_VERSION}-ohos-arm64"HNP_PUBLIC_PATH="/data/service/hnp"MAKE_INSTALL_PATH="${HNP_PUBLIC_PATH}/make.org/make_${MAKE_VERSION}"OUTPUT_DIR="output"WORKDIR=$(pwd)# 创建输出目录mkdir-p${OUTPUT_DIR}# 解压 tar.gz 包if[!-d"${EXTRACT_DIR}"];thenecho"解压${TAR_FILE}..."tar-zxf${TAR_FILE}fi# 创建安装目录echo"创建安装目录..."mkdir-p${MAKE_INSTALL_PATH}/bin# 复制文件echo"复制文件..."cp-r${EXTRACT_DIR}/bin/*${MAKE_INSTALL_PATH}/bin/if[-f"${EXTRACT_DIR}/COPYING"];thencp${EXTRACT_DIR}/COPYING${MAKE_INSTALL_PATH}/fi# 创建 hnp.jsonecho"创建 hnp.json..."cat>${MAKE_INSTALL_PATH}/hnp.json<<'EOF' { "type": "hnp-config", "name": "make", "version": "4.4.1", "install": { "links": [ { "source": "bin/make", "target": "make" } ] } } EOF# 设置执行权限chmod+x${MAKE_INSTALL_PATH}/bin/make# 使用 hnpcli 打包(如果可用)ifcommand-v hnpcli&>/dev/null;thenecho"使用 hnpcli 打包..."hnpcli pack -i${MAKE_INSTALL_PATH}-o${OUTPUT_DIR}/echo"HNP 包已生成:${OUTPUT_DIR}/make.hnp"elseecho"警告: 未找到 hnpcli 工具,跳过 HNP 包生成"echo"请手动使用 hnpcli 打包:"echo" hnpcli pack -i${MAKE_INSTALL_PATH}-o${OUTPUT_DIR}/"fi# 生成 tar.gz 包(备用)echo"生成 tar.gz 包..."cd${HNP_PUBLIC_PATH}/make.orgtar-zcf${WORKDIR}/${OUTPUT_DIR}/ohos_make_${MAKE_VERSION}.tar.gz make_${MAKE_VERSION}/cd->/dev/nullecho"打包完成!"echo"输出文件:"echo" -${OUTPUT_DIR}/make.hnp (如果 hnpcli 可用)"echo" -${OUTPUT_DIR}/ohos_make_${MAKE_VERSION}.tar.gz"

3.4 验证打包结果

打包完成后,验证生成的文件:

# 检查 HNP 包ls-lh output/make.hnp# 检查 tar.gz 包ls-lh output/ohos_make_4.4.1.tar.gz# 验证安装目录结构tree${MAKE_INSTALL_PATH}/

预期的安装目录结构:

/data/service/hnp/make.org/make_4.4.1/ ├── bin/ │ └── make # make 可执行文件 ├── COPYING # 许可证文件 └── hnp.json # HNP 配置文件

四、安装与使用

4.1 安装 HNP 包

手动安装(使用 tar.gz)
# 在鸿蒙PC上执行# 1. 解压 tar.gz 包tar-xzf ohos_make_4.4.1.tar.gz# 2. 复制到安装目录sudocp-r make_4.4.1/* /data/service/hnp/make.org/make_4.4.1/# 3. 设置执行权限sudochmod+x /data/service/hnp/make.org/make_4.4.1/bin/*# 4. 创建符号链接(根据 hnp.json 配置)# hnp 系统会自动处理 links 配置,但也可以手动创建sudoln-sf /data/service/hnp/make.org/make_4.4.1/bin/make /usr/local/bin/make

4.2 验证安装

# 检查 make 是否可用make--version# 应该显示 GNU make 的版本信息# GNU Make 4.4.1

4.3 使用 make

安装完成后,就可以使用 make 来构建项目了:

# 基本使用make# 指定 Makefilemake-f Makefile# 指定目标maketarget# 并行构建make-j4

五、使用示例

5.1 基本 Makefile

创建一个简单的 Makefile:

Makefile:

CC = gcc CFLAGS = -Wall -g hello: hello.o $(CC) $(CFLAGS) -o hello hello.o hello.o: hello.c $(CC) $(CFLAGS) -c hello.c clean: rm -f hello hello.o .PHONY: clean

hello.c:

#include<stdio.h>intmain(){printf("Hello, World!\n");return0;}

构建步骤:

make./hello

5.2 多文件项目

Makefile:

CC = gcc CFLAGS = -Wall -g TARGET = myapp SOURCES = main.c utils.c OBJECTS = $(SOURCES:.c=.o) $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(TARGET) $(OBJECTS) .PHONY: clean

5.3 使用变量和函数

Makefile:

# 变量定义 SRC_DIR = src OBJ_DIR = obj BIN_DIR = bin SOURCES = $(wildcard $(SRC_DIR)/*.c) OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) TARGET = $(BIN_DIR)/myapp # 编译规则 $(TARGET): $(OBJECTS) @mkdir -p $(BIN_DIR) $(CC) $(CFLAGS) -o $@ $^ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ clean: rm -rf $(OBJ_DIR) $(BIN_DIR) .PHONY: clean

5.4 并行构建

# 使用 4 个并行任务make-j4# 使用所有可用 CPU 核心make-j$(nproc)

5.5 条件编译

Makefile:

DEBUG ?= 0 ifeq ($(DEBUG), 1) CFLAGS += -DDEBUG -g else CFLAGS += -O2 -DNDEBUG endif myapp: main.c $(CC) $(CFLAGS) -o myapp main.c

使用:

# 调试版本makeDEBUG=1# 发布版本makeDEBUG=0

5.6 与 autoconf 配合使用

# 使用 autoconf 生成的 Makefile./configuremakemakeinstall

六、常见问题

6.1 权限问题

问题:安装后无法执行 make 命令?

解决方案:

# 检查文件权限ls-l /data/service/hnp/make.org/make_4.4.1/bin/make# 设置执行权限chmod+x /data/service/hnp/make.org/make_4.4.1/bin/make# 检查符号链接ls-l /usr/local/bin/make

6.2 Makefile 语法错误

问题:make 报语法错误?

解决方案:

  • 确保 Makefile 使用 Tab 而不是空格来缩进
  • 检查变量和目标的语法
  • 使用make -d查看详细的调试信息

6.3 依赖问题

问题:make 找不到依赖文件?

解决方案:

# 查看依赖关系make-n# 强制重新构建make-B# 查看详细的构建过程make-d

6.4 构建相关问题

问题:如何从源码构建 make?

回答:

参考项目 README 中的构建说明,需要在 Linux x64 服务器上运行build.sh脚本进行交叉编译:

# 在 Ubuntu 24.04 x64 上sudoaptupdate&&sudoaptinstall-y build-essentialunzip./build.sh

构建过程会:

  1. 下载 OpenHarmony SDK
  2. 设置交叉编译环境
  3. 下载并编译 GNU make 源码
  4. 生成预构建包

6.5 版本问题

问题:系统已有 make,如何确保使用 GNU make?

解决方案:

# 检查当前使用的 makewhichmakemake--version# 如果系统 make 版本较旧,确保 GNU make 在 PATH 前面exportPATH=/data/service/hnp/make.org/make_4.4.1/bin:$PATH

Q4: 如何卸载 make?

A:手动卸载:

# 删除安装目录sudorm-rf /data/service/hnp/make.org/make_4.4.1# 删除符号链接sudorm-f /usr/local/bin/make

七、总结与最佳实践

7.1 使用建议

  1. 优先使用 HNP 包:在鸿蒙PC上,优先使用 HNP 包安装,符合系统安全规范。
  2. 合理使用并行构建:使用-j选项可以显著提升构建速度,但要注意内存使用。
  3. 保持 Makefile 简洁:使用变量和函数来简化 Makefile,提高可维护性。
  4. 版本管理:在项目中记录使用的 make 版本,确保团队环境一致。

7.2 性能优化

  1. 并行构建:使用make -j$(nproc)充分利用多核 CPU。
  2. 增量构建:make 会自动检测文件修改,只重新编译必要的文件。
  3. 避免不必要的重建:正确设置依赖关系,避免不必要的重新编译。
  4. 使用.PHONY:对于不生成文件的伪目标,使用.PHONY声明。

7.3 最佳实践

  1. 项目结构:遵循标准的项目结构,将源文件、目标文件和可执行文件分开。
  2. 变量使用:使用变量来定义编译器、编译选项等,便于修改和维护。
  3. 依赖管理:正确设置文件间的依赖关系,确保构建的正确性。
  4. 文档化:在 Makefile 中添加注释,说明各个目标和变量的用途。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1025473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分析式AI】-机器学习的分类以及学派

1. 监督学习 核心原理&#xff1a;模型在带有标签的训练数据上学习&#xff0c;输入数据&#xff08;如特征&#xff09;和对应输出标签&#xff08;如类别或数值&#xff09;已知。目标是学习输入到输出的映射关系。典型应用&#xff1a;预测房价&#xff08;回归&#xff09;…

LobeChat能否识别面部表情?情感反馈闭环

LobeChat能否识别面部表情&#xff1f;情感反馈闭环 在智能对话系统日益普及的今天&#xff0c;用户对AI助手的期待早已超越了“问一句答一句”的机械交互。我们希望它不只是聪明&#xff0c;更要有温度——能察觉我们的疲惫、理解我们的低落&#xff0c;甚至在我们微笑时回应以…

FaceFusion显卡利用率低?解决cuDNN加载失败问题

FaceFusion显卡利用率低&#xff1f;解决cuDNN加载失败问题 在AI视频创作领域&#xff0c;FaceFusion 已成为许多创作者的首选工具。它不仅能实现高精度的人脸替换&#xff0c;还支持表情迁移、年龄变换等复杂操作&#xff0c;在保持画面自然度方面表现尤为出色。然而&#xf…

StarRocks报错解决方案Failed to find enough host in all backends. need: 3, Current alive backend is [10003]

我们项目测试的StarRocks组件只有一台backend节点。当我想创建一张OLAP表&#xff1a;CREATE TABLE IF NOT EXISTS summary (date BIGINT NOT NULL COMMENT 时间-年,格式:yyyy,id BIGINT NOT NULL COMMENT 主键,level_o VARCHAR(20) NOT NULL COMMENT level_o,level_t VARCHAR(…

AWS成本优化的五个高阶战术:实战经验让你至少节省30%

作为已经服务超过50家企业客户的AWS认证架构师,今天我将分享几个真正有效且可快速复制的高阶成本优化战术,这些方案正在为我们的客户平均节省30%以上的云上成本。 引言:当"基本优化"已触达天花板后 三个月前,一家电商企业的技术负责人找到我:"我们已关闭闲…

YOLOv5车辆与车牌识别全功能实现

YOLOv5车辆与车牌识别全功能实现 在智能交通系统快速演进的今天&#xff0c;如何让摄像头“看懂”车流、自动识别违章行为&#xff0c;已成为城市治理和园区管理的关键需求。传统方案依赖多模块拼接&#xff0c;稳定性差、延迟高&#xff1b;而我们这套基于YOLOv5构建的端到端…

深度剖析:如何通过数据即服务释放大数据商业价值?

深度剖析:如何通过数据即服务释放大数据商业价值? 关键词:数据即服务(DaaS)、大数据、商业价值、数据资产、API、数据治理、价值转化 摘要:在“数据成为新石油”的数字经济时代,企业如何将海量数据从“成本中心”转化为“价值引擎”?本文以“数据即服务(DaaS)”为核心…

数据库计算题解析:关系模式R的函数依赖与范式分析

【例】设有关系模式 R(A,B,C,D,E) 与它的函数依赖集 F {A→BC, CD→E, B→D, E→A}&#xff0c;求 R 的所有候选键。 这是一个典型的数据库理论题&#xff0c;考察的是如何根据函数依赖集推导出关系模式的所有候选键&#xff08;Candidate Keys&#xff09;&#xff0c;属于数…

Dify平台深度解析:降低大模型应用开发门槛的关键

Dify平台深度解析&#xff1a;降低大模型应用开发门槛的关键 在AI技术加速渗透各行各业的今天&#xff0c;大型语言模型&#xff08;LLM&#xff09;已不再是实验室里的“黑科技”&#xff0c;而是逐步成为企业产品创新和效率提升的核心驱动力。然而&#xff0c;从GPT-3发布至今…

从零开始配置TensorFlow环境:推荐使用清华镜像源

从零开始配置TensorFlow环境&#xff1a;推荐使用清华镜像源 在深度学习项目启动的第一天&#xff0c;你是否曾经历过这样的场景&#xff1f;打开终端&#xff0c;输入 pip install tensorflow&#xff0c;然后眼睁睁看着进度条卡在10%&#xff0c;等了半小时还是失败——网络超…

《计算机组成原理与汇编语言程序设计》期末复习:3道核心问答题详解(每题10分)

一、简述存储程序工作方式&#xff0c;并说明计算机硬件的基本组成以及CPU的基本结构。&#xff08;10分&#xff09; 存储程序工作方式是指将程序和数据以二进制形式统一存放在存储器中&#xff0c;计算机启动后能自动逐条取出并执行指令&#xff0c;实现自动控制。计算机硬件…

LobeChat适合做AI客服吗?对比专业客服系统的差距

LobeChat 适合做 AI 客服吗&#xff1f;它和专业系统的真正差距 在企业纷纷拥抱 AI 的今天&#xff0c;一个现实问题摆在许多技术负责人面前&#xff1a;能不能用像 LobeChat 这样的开源聊天界面&#xff0c;直接替代 Zendesk 或阿里云智能客服这类“贵且重”的系统&#xff1f…

阿里云服务器虚拟化技术的特点,为什么要使用虚拟化技术?

阿里云服务器虚拟化技术是其云计算服务的核心基础&#xff0c;其设计旨在最大化硬件资源的利用率、提升灵活性并保障安全。以下是其主要特点及采用虚拟化技术的原因分析&#xff1a; 阿里云服务器虚拟化技术的主要特点 高性能与低损耗 采用自主研发的「神龙架构」&#xff08;X…

算法基础-字典树

1. 字典树的概念 Trie 树⼜叫字典树或前缀树&#xff0c;是⼀种能够快速插⼊和查询字符串的数据结构。它利⽤字符串的公共前 缀&#xff0c;将字符串组织成⼀棵树形结构&#xff0c;从⽽⼤ 提⾼了存储以及查找效率。 我们可以把字典树想象成⼀棵多叉树&#xff0c;每⼀条边代表…

13分钟微调自己的AI模型?这个“作弊“方法,让小模型吊打大模型

当小模型开始"开挂"&#xff1a;一场AI界的"以小博大"革命 你有没有想过&#xff0c;为什么OpenAI要花几千万美元训练GPT-5&#xff0c;而你却可能用13分钟、零成本&#xff0c;创造出一个在特定领域吊打GPT-5的模型&#xff1f; 听起来像是骗局&#xff1…

瑞芯微(EASY EAI)RV1126B USB摄像头

1. USB简介 USB&#xff1a;Universal Serial Bus&#xff08;通用串行总线&#xff09;。是一种常用于电子设备间通讯的通用标准接口。USB 总线作为一种高速串行总线&#xff0c;其极高的传输速度可以满足高速数据传输的应用环境要求。 具有供电简单&#xff08;可总线供电&…

m4宏处理器在鸿蒙PC上的应用指南

ohos-m4 是为 OpenHarmony 平台编译的 m4 宏处理器。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 m4 工具&#xff0c;包括 HNP 包的打包、安装和使用方法。 &#x1f4cb; 目录 一、项目概述二、为什么需要 HNP 包三、HNP 包打包方法四、安装与使用五、使用示例六…

在 React 中实现数学公式显示:使用 KaTeX 和 react-katex

在 React 中实现数学公式显示&#xff1a;使用 KaTeX 和 react-katex 前言 在 Web 应用中显示数学公式一直是一个挑战。传统的图片方式不够灵活&#xff0c;而使用 LaTeX 渲染引擎可以在浏览器中直接渲染高质量的数学公式。本文将介绍如何在 React 项目中使用 react-katex 和 …

解决facefusion报错No source face detected

解决 FaceFusion 报错&#xff1a;No source face detected 在使用 FaceFusion 进行人脸替换时&#xff0c;你是否曾满怀期待地运行命令&#xff0c;结果却只等来一句冰冷的提示&#xff1a; No source face detected程序戛然而止&#xff0c;换脸流程中断。这并非模型崩溃或内…

Qwen-Image微调实战:让模型学会新车图片生成

Qwen-Image微调实战&#xff1a;让模型学会新车图片生成 在智能汽车快速迭代的今天&#xff0c;一款新车型从发布到上市&#xff0c;往往只有短短几个月时间。而市场部门却要立刻产出高质量宣传图、社交媒体素材甚至VR展厅内容。这时候你会发现&#xff0c;即便是最先进的AI图…