当前位置: 首页 > news >正文

make = make install?

不,make不等于make install

这是一个非常经典且致命的误区。对于原子化失业期 PHP 程序员来说,混淆这两个命令可能导致你编译出了模块却找不到文件,或者错误地覆盖了系统库。

它的本质是:make是“制造 (Build)”,make install是“部署 (Deploy)”。前者在本地目录生成二进制文件,后者将文件复制到系统的全局路径。

如果把软件开发比作家具制作

  • make(制造):你在自家车库(当前源码目录)里,把木头锯好、钉好,做成了一把椅子。椅子就在你脚边。
  • make install(部署):你把这把椅子搬出去,放到商场的展示厅(系统目录,如/usr/local/lib),让所有人都能用到它。
  • 核心逻辑先制造,后部署。你可以只制造不部署(测试用),也可以手动部署(复制粘贴)。

一、工作流程差异:它们在干什么?

1.make(编译/构建)
  • 依据:读取当前目录下的Makefile
  • 动作
    1. 调用编译器 (gcc/cc)。
    2. .c源文件编译成.o对象文件。
    3. 链接对象文件和依赖库。
    4. 生成最终的二进制文件(如redisbloom.so,nginx,php)。
  • 结果位置通常在当前源码目录下,或者子目录(如src/,modules/)。
  • 权限:不需要sudo,因为是在你自己的目录写文件。
2.make install(安装/部署)
  • 依据:读取Makefile中的install目标。
  • 动作
    1. 复制:将make生成的二进制文件、配置文件、头文件、文档复制到系统标准目录。
    2. 创建链接:可能创建软链接。
    3. 更新缓存:如运行ldconfig更新动态库缓存。
  • 结果位置系统全局目录,如:
    • 可执行文件:/usr/local/bin/
    • 库文件:/usr/local/lib/
    • 头文件:/usr/local/include/
  • 权限:通常需要sudo,因为要写入受保护的系统目录。

💡 核心洞察make产出的是“工件 (Artifact)”,make install做的是“搬运 (Copy)”。


二、文件去向对比表

步骤命令输入输出位置是否需要 Root目的
1. 构建make源码 (.c/.h)当前目录(如./redisbloom.so)❌ 否验证代码,生成可运行文件
2. 安装make install构建产物系统目录(如/usr/lib/redis/modules/)✅ 是 (通常)让系统其他程序能找到并使用

三、RedisBloom 实战:你需要install吗?

回到你刚才克隆的RedisBloom

1. 执行make
cdRedisBloommake
  • 结果:在当前目录下生成了redisbloom.so
  • 状态:模块已编译好,但 Redis 还不知道它在哪。
2. 执行make install(可选)
sudomakeinstall
  • 结果redisbloom.so被复制到了默认模块目录(通常是/usr/local/lib/redis/modules/或类似路径,取决于编译时的PREFIX)。
  • 好处:你可以在redis.conf中直接写loadmodule redisbloom.so,而不必写绝对路径。
3.更常见的做法:手动指定路径 (无需 install)

很多运维人员不喜欢make install,因为它污染系统目录,且难以卸载。

  • 做法
    1. 只运行make
    2. redis.conf中写绝对路径:
      loadmodule /home/user/RedisBloom/redisbloom.so
    3. 重启 Redis。
  • 优势:清晰明了,删除源码即卸载,无残留。

四、常见陷阱与最佳实践

1. 陷阱:忘了make直接make install
  • 现象:报错No rule to make target 'install'或安装了一个旧版本/空文件。
  • 原因:某些 Makefile 要求先 build 才能 install。
  • 解决:始终先make,再make install。或者使用make && sudo make install
2. 陷阱:权限不足
  • 现象Permission denied
  • 原因make install试图写入/usr/local
  • 解决:加sudo。但要注意,sudo make是不推荐的(编译过程不应需要 root),只有install需要。
3. 陷阱:卸载困难
  • 问题make install通常没有对应的make uninstall(除非开发者好心写了)。
  • 后果:系统目录里堆积了大量不知来源的文件。
  • 最佳实践
    • 使用包管理器 (apt,yum) 安装的软件,用包管理器卸载。
    • 源码编译的软件,尽量不使用make install,而是通过指定路径加载,或使用checkinstall工具生成 deb/rpm 包再安装。
4. PHP 扩展的特殊性

如果你编译的是PHP 扩展(如phpredis):

  • make:生成modules/redis.so
  • make install:将redis.so复制到 PHP 的extension_dir(如/usr/lib/php/20210902/)。
  • 注意:如果手动复制,必须确保目标目录权限正确,且php.ini中能加载到。

🚀 总结:原子化“构建 vs 安装”全景图

维度makemake install
动作编译、链接复制、配置
地点本地源码目录系统全局目录
权限用户权限通常需 Root (sudo)
可逆性make clean可清理难卸载(除非有 uninstall)
必要性必须(否则没文件)可选(可手动复制)
隐喻造车上牌上路

终极心法

Linux 编译的本质,是“分离构建与部署”。
make是为了验证和生成。
make install是为了集成和共享。
对于个人学习或临时测试,make足矣,配合绝对路径使用。
对于生产环境,谨慎使用make install,优先考虑包管理或容器化。
于构建中见产物,于安装中见集成;以路径为界,解混淆之牛,于系统管理中,求清晰之真。

行动指令

  1. 回顾 RedisBloom:你之前只做了make吗?检查当前目录下是否有redisbloom.so
  2. 决定策略
    • 如果想简单:直接在redis.conf用绝对路径加载当前的.so文件。
    • 如果想规范:执行sudo make install,然后修改配置为文件名。
  3. 验证加载:重启 Redis,MODULE LIST确认生效。
  4. 思维升级:记住,文件在哪里不重要,重要的是进程能否找到并加载它。
http://www.jsqmd.com/news/680044/

相关文章:

  • Campus-i茅台:自动化预约解决方案的技术探索与实践
  • 从校园卡到公交卡:拆解你钱包里那些M1卡的前世今生与安全困境
  • 从“对称”到“非对称”:手把手教你用ADDA为自定义数据集做域适配(避坑指南)
  • 2026年合肥工程纠纷律师选择指南:合肥合同纠纷律师事务所、合肥安徽律师事务所、合肥工伤律师事务所、合肥工程纠纷律师事务所选择指南 - 优质品牌商家
  • 告别迷茫!手把手教你用CANoe 15.0从零搭建第一个仿真工程(附DBC文件创建)
  • MangoPi-MQ(麻雀)开发板Tina系统编译避坑指南:从补丁到烧录的完整实战
  • 别再只用AUC了!手把手教你给XGBoost模型添加F1和准确率评估(附完整代码)
  • 别再手动配环境了!用Docker Compose一键部署ELK 7.17.2(附SpringBoot日志接入完整配置)
  • 你的第一个实例分割项目:从Labelme标注到用MMDetection训练(COCO格式实战)
  • Mini PCIe vs M.2接口全对比:看完这篇就知道你的项目该选哪种
  • 告别玄学调试:用Wireshark抓包实战解析PCIe链路训练与有序集(TS1/TS2/EIOS全解)
  • 2026年轴销螺栓供应商梯队盘点:GB31.1/GB32.1/六角头头部带孔螺栓/六角头螺杆带孔螺栓/带孔紧固件/选择指南 - 优质品牌商家
  • 别再乱用事件过滤器了!Qt中让QLineEdit智能失焦的两种正确姿势(附QCompleter处理)
  • 用Python+CAPL玩转CANoe自动化测试:从环境搭建到实战脚本(附GitHub源码)
  • MediaCreationTool.bat终极指南:Windows 10/11全版本部署与硬件限制突破实战
  • Arm Linux身份证读卡器开发实战:从交叉编译到so库生成全流程
  • 不止是参数表:手把手带你玩转飞凌OK3588-C开发板,从开箱到跑通第一个AI Demo
  • 3D地球卫星轨道可视化平台开发 Day14(彻底移除多余阴影)
  • Spring Boot 4.0:云原生 Java 开发的范式革命
  • 避坑指南:CEEMDAN参数(Nstd, NE, MaxIter)怎么调?附MATLAB代码与效果对比
  • 从Kaggle竞赛到业务报表:回归模型评估指标R²、RMSE、MAE的‘场景化生存指南’
  • ESP32 + micro-ROS实战:手把手教你用Action Server做个智能小车遥控器
  • 保姆级教程:手把手教你用Python解析GFS气象数据(附完整变量对照表)
  • 虚幻引擎串口通信插件终极指南:5分钟连接Arduino硬件
  • 用XC7K325T+XDMA实现PC与FPGA高速数据交换:手把手教你玩转驱动自带测试工具
  • Python和LabVIEW搞TCP通信,这3个坑我帮你踩过了(附完整调试流程)
  • 碧蓝航线Alas脚本:告别手动肝船的全自动游戏管家终极指南
  • 如何快速配置暗黑3自动化工具:D3KeyHelper新手完整入门指南
  • 用J-Link Commander和逻辑分析仪,手把手教你调试ARM Cortex-M4的JTAG-DAP接口
  • 【Qwen3-Omni-30B-A3B-Instruct 】部署与多模态安全监测系统