如何编译安装源码包 configure/make编译流程详解

编译安装源码包的步骤为:1. 从官网等可靠来源下载.tar.gz或.tar.bz2格式的源码包;2. 使用tar命令解压源码包,如tar -zxvf package.tar.gz或tar -jxvf package.tar.bz2;3. 进入解压后的源码目录,使用cd命令切换路径;4. 运行./configure脚本检查系统环境并生成makefile文件,可通过–prefix指定安装路径,若缺少依赖则需根据提示安装对应开发库;5. 执行make命令根据makefile编译源码,可使用make -j n利用多核加速编译;6. 执行sudo make install将编译好的文件安装到指定目录,此步通常需要root权限;7. 若安装路径非标准目录,需修改~/.bashrc或~/.zshrc文件,添加path和ld_library_path环境变量,并执行source命令使其生效。

如何编译安装源码包 configure/make编译流程详解

简单来说,编译安装源码包就是把一堆人类能看懂的代码,变成机器能执行的程序。Configure负责配置编译环境,Make根据配置好的环境进行编译,最后Make install将编译好的程序安装到指定位置。这就是一个化腐朽为神奇的过程。

解决方案

编译安装源码包通常遵循以下步骤:

获取源码包: 从官方网站或者其他可靠来源下载源码包,通常是

.tar.gz

.tar.bz2

格式的压缩文件。

解压源码包: 使用

tar

命令解压源码包。例如:

tar -zxvf package.tar.gz  # 解压.tar.gz文件tar -jxvf package.tar.bz2  # 解压.tar.bz2文件

进入源码目录: 使用

cd

命令进入解压后的源码目录。

运行

configure

脚本: 这是编译安装的关键步骤。

configure

脚本会检查你的系统环境,比如是否安装了必要的依赖库,然后生成

Makefile

文件。

./configure --prefix=/usr/local/package  # 指定安装目录,默认是/usr/local

--prefix

选项指定了程序的安装目录,如果不指定,默认安装到

/usr/local

目录下。还可以根据需要添加其他选项,例如

--enable-feature

--disable-feature

来启用或禁用某些功能。

如果缺少依赖,

configure

会报错,你需要根据错误提示安装相应的依赖库。在Debian/Ubuntu系统上,可以使用

apt-get install

命令安装,在CentOS/RHEL系统上,可以使用

yum install

命令安装。

运行

make

命令:

make

命令会根据

Makefile

文件中的指令,将源码编译成可执行文件。

make

如果你的系统是多核处理器,可以使用

make -j 

来并行编译,加快编译速度。例如,如果你的系统有8个核心,可以使用

make -j 8

编译过程中可能会出现错误,你需要根据错误提示修改源码或者安装缺失的依赖库。

运行

make install

命令:

make install

命令会将编译好的可执行文件、库文件、配置文件等安装到指定目录。

sudo make install  # 需要root权限

通常需要

root

权限才能执行

make install

命令,因为系统目录通常需要

root

权限才能写入。

配置环境变量: 如果程序安装到了非标准目录,你需要将程序的安装目录添加到环境变量中,才能在命令行中直接运行程序。

修改

~/.bashrc

~/.zshrc

文件,添加以下内容:

Stable Diffusion 2.1 Demo Stable Diffusion 2.1 Demo

最新体验版 Stable Diffusion 2.1

Stable Diffusion 2.1 Demo 101 查看详情 Stable Diffusion 2.1 Demo

export PATH=$PATH:/usr/local/package/binexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/package/lib

然后执行

source ~/.bashrc

source ~/.zshrc

命令,使环境变量生效。

为什么

configure

脚本很重要?它做了哪些事情?

configure

脚本就像一个项目经理,负责统筹整个编译过程。它主要做了以下几件事情:

检查系统环境: 检查编译器、库文件等依赖是否安装,版本是否符合要求。生成

Makefile

根据系统环境和用户指定的选项,生成

Makefile

文件。

Makefile

文件包含了编译的指令,

make

命令会根据

Makefile

文件中的指令进行编译。创建目录: 创建必要的目录,例如安装目录、临时目录等。执行其他配置任务: 根据具体的项目,执行其他配置任务,例如生成配置文件、设置编译选项等。

configure

脚本的目的是为了让编译过程更加自动化和可移植。它可以根据不同的系统环境生成不同的

Makefile

文件,从而保证程序可以在不同的系统上编译和运行。

遇到

configure

报错,常见的错误有哪些?如何解决?

configure

报错是编译安装过程中常见的问题。常见的错误包括:

缺少依赖库: 错误提示通常会告诉你缺少哪个库,例如

configure: error: *** libpng not found

解决方法是安装相应的库。在Debian/Ubuntu系统上,可以使用

apt-get install libpng-dev

命令安装,在CentOS/RHEL系统上,可以使用

yum install libpng-devel

命令安装。注意,需要安装的是

-dev

-devel

后缀的开发包,而不是运行时库。编译器版本不符合要求: 错误提示通常会告诉你编译器版本过低或过高。解决方法是升级或降级编译器。权限不足: 错误提示通常会告诉你没有权限创建目录或写入文件。解决方法是使用

sudo

命令运行

configure

脚本,或者修改目录的权限。其他错误: 错误提示可能是一些其他的错误,例如配置文件错误、脚本错误等。解决方法是仔细阅读错误提示,查找相关的资料,或者向社区寻求帮助。

解决

configure

报错的关键是仔细阅读错误提示,理解错误的原因,然后根据错误的原因采取相应的解决方法。

make

make install

区别是什么?

make

命令负责将源码编译成可执行文件,而

make install

命令负责将编译好的可执行文件、库文件、配置文件等安装到指定目录。

make

命令只是编译源码,不会修改系统文件。而

make install

命令会修改系统文件,例如将可执行文件复制到

/usr/local/bin

目录下,将库文件复制到

/usr/local/lib

目录下,将配置文件复制到

/usr/local/etc

目录下。因此,通常需要

root

权限才能执行

make install

命令。

可以把

make

看作是生产零件,

make install

看作是组装和安装。

如何卸载通过源码编译安装的软件?

卸载通过源码编译安装的软件,通常没有像包管理器那样方便的卸载命令。一般来说,有以下几种方法:

使用

make uninstall

命令: 有些源码包提供了

make uninstall

命令,可以直接卸载软件。在源码目录下执行

sudo make uninstall

命令即可。但是,并不是所有的源码包都提供了

make uninstall

命令,如果没有,就需要手动卸载。

手动删除文件: 手动删除安装目录下的文件。首先,你需要知道软件安装到了哪些目录。如果你在

configure

的时候指定了

--prefix

选项,那么软件就安装到了指定的目录下。如果没有指定,默认安装到

/usr/local

目录下。然后,你需要手动删除这些目录下的文件。例如:

sudo rm -rf /usr/local/package

这种方法比较麻烦,而且容易遗漏文件。

记录安装文件: 在安装之前,使用

make install

命令的

-n

选项,可以模拟安装过程,并输出安装的文件列表。然后,将这些文件列表保存下来,卸载的时候,就可以根据文件列表删除文件。例如:

make install -n > install.log

然后,根据

install.log

文件中的文件列表删除文件。

这种方法比较可靠,但是需要提前做好准备。

卸载通过源码编译安装的软件需要小心谨慎,避免误删系统文件。建议在卸载之前备份相关文件。

以上就是如何编译安装源码包 configure/make编译流程详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/937394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
梦幻西游召唤兽饰品如何染色-2025年梦幻西游召唤兽饰品染色效果图
上一篇 2025年11月29日 16:04:07
u盘文件删除了怎么恢复
下一篇 2025年11月29日 16:04:12

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 如何让动态追加元素的类事件生效?

    如何在追加元素后使其绑定类事件生效 在页面中引入三方 JavaScript 类并通过添加相应 class 来调用事件方法是一种常见的做法。然而,如果通过 JavaScript 追加标签元素,即使添加了对应的 class,事件也可能无法生效。 为了解决这个问题,可以尝试以下步骤: 检查追加的标签是否为…

    2026年5月10日
    000
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • php常量怎么用_PHP常量(define/const)定义与使用方法

    PHP中可通过define函数和const关键字定义常量,用于存储不可变值。define适用于全局作用域,支持动态名称和条件定义,如define(‘SITE_NAME’, ‘MyWebsite’);const在编译时生效,语法简洁但限制多,只能在类或全…

    2026年5月10日
    000
  • 网站标题关键词更新后,搜索引擎为何仍显示旧标题?

    网站标题更新后,搜索引擎为何显示旧标题? 网站SEO优化中,站长常修改网站标题关键词,期望搜索结果显示自定义标题。然而,即使更新标签、meta keywords、meta description和结构化数据中的name属性后,搜索结果仍显示旧标题,这令人费解。本文将对此进行解释。 问题:站长修改了网…

    2026年5月10日
    100
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • JavaScript 闭包:理解闭包原理与内存泄漏问题

    闭包是函数访问其外部作用域变量的能力,即使外部函数已执行完毕。如 inner 函数引用 outer 中的 count,形成闭包,使变量持久存在。闭包本身无害,但可能因延长变量生命周期导致内存泄漏,例如事件监听器引用大对象时。若未及时清理 DOM 事件或定时器,闭包会阻止垃圾回收,造成内存占用过高。解…

    2026年5月10日
    100
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    100
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    100
  • 三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布

    三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布三星不再独享,消息称搭载骁龙 8 Gen 3 领先版处理器新机即将发布

    6 月 15 日消息,据博主@肥威 今日爆料,搭载骁龙 8 Gen 3 领先版%ign%ignore_a_1%re_a_1%的新机即将发布,把之前的 for Galaxy 改成“for Everybody”。 Pic Copilot AI时代的顶级电商设计师,轻松打造爆款产品图片 158 查看详情 …

    2026年5月10日 用户投稿
    100
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000
  • Go语言接口与切片:如何识别和操作[]interface{}

    本文将深入探讨Go语言中如何识别和操作`[]interface{}`类型的切片。我们将介绍类型断言(Type Assertion)的关键作用,并通过`switch`语句演示如何安全地检测`[]interface{}`类型,并进而遍历其内部元素。文章旨在提供清晰的示例代码和专业指导,帮助开发者有效地处…

    2026年5月10日
    000
  • 高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行

    高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行高通预热 2023 骁龙峰会:以AI为主题,10 月 25-26 日举行

    【环球网科技综合报道】10月17日消息,高通今日对 2023 骁龙峰会进行了预热,本次大会将以 %ign%ignore_a_1%re_a_1% 为主题,届时骁龙 8 gen 3 处理器也很大可能在本届峰会亮相。 在临近活动召开之日,相关业内人士也透露了高通骁龙8Gen3跑分及规格。据悉,高通骁龙8 …

    2026年5月10日 用户投稿
    000
  • c++中头文件和源文件的区别_c++头文件与源文件作用对比

    头文件声明接口,源文件实现逻辑。头文件含类、函数声明及宏定义,通过#include被多文件共享,用include守卫防重;源文件实现具体功能,编译为目标文件后由链接器合并。声明与实现分离提升模块化与编译效率,模板和内联函数因需编译时可见故常置于头文件,命名空间避免符号冲突,整体结构使项目更清晰易维护…

    2026年5月10日
    000
  • HTML文档的基本结构是什么? 3分钟带你了解HTML文档基础框架

    html文档的基础结构由四部分组成:1. 声明,用于告知浏览器以html5标准模式解析页面,避免怪异模式导致的兼容性问题;2. 根元素,包裹整个文档内容,并可通过lang属性指定语言;3. 头部区域,包含元数据如设置字符编码、实现响应式布局、定义页面标题、引入css和favicon、加载脚本等;4.…

    2026年5月10日
    000
  • Android和iOS系统下,HTML+JS代码运行结果差异:为什么input宽度为0时,Android输入方向异常?

    Android和iOS系统HTML+JS代码运行差异分析:input宽度为0引发的Android输入方向异常 开发OTP输入组件时,我们发现一个有趣的现象:当input元素的宽度设置为0 (style=”width: 0;”)时,Android系统下的输入方向会异常,而iOS系统则正常工作。 移除w…

    2026年5月10日
    000
  • Go语言中复制数组的几种方法详解

    本文介绍了在 Go 语言中复制数组和切片的几种方法,重点讲解了内置的 `copy` 函数的使用方式,以及在多维切片场景下深拷贝与浅拷贝的区别,并提供了相应的代码示例。通过本文,你将掌握在不同场景下选择合适的复制方法,避免潜在的陷阱。 在 Go 语言中,复制数组和切片是一个常见的操作。根据不同的需求,…

    2026年5月10日
    000
  • JavaScript设计原则_JavaScript可维护代码

    每个函数应只做一件事,如拆分数据处理与DOM操作,命名体现功能(如formatDate),长度控制在20行内;2. 使用清晰命名(如currentUser、isValid)减少注释依赖,关键逻辑注明“为什么”;3. 按功能模块化组织代码,如api.js处理请求,utils.js存放工具函数,使用im…

    2026年5月10日
    000
  • C++如何编译和链接_C++从源码到可执行文件的过程解析

    c++kquote>预处理展开宏和头文件,编译生成汇编代码,汇编转为机器码,链接合并目标文件与库生成可执行程序。 当你写完一段C++代码,比如一个简单的hello world程序,最终能运行起来,背后其实经历了一系列步骤:预处理、编译、汇编和链接。这个过程将人类可读的源码转换成机器可以执行的程…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信