用通俗到业余水平的语言教你编译和打包

2024-06-23 16:48

本文主要是介绍用通俗到业余水平的语言教你编译和打包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文从零开始讲述编译的基本过程,希望菜鸟们能喜欢。毕竟Linux下的软件,源代码是多于二进制包的,学会了编译,再安装软件就不求别人了。所以,编译也是Linux菜鸟必修的一课。

1,安装编译工具。
$ sudo apt-get install dpkg-dev file gcc g++ libc6-dev make patch perl autoconf automake dh-make debhelper devscripts fakeroot gnupg g77 gpc xutils lintian pbuilder

2,安装傻瓜打包工具
(同时推荐另外的两个傻瓜编译+打包工具DebCreator/DebianPackageMaker,可以在www.getdeb.net获取)。
$ sudo apt-get install checkinstall。

3,下载源码,并解压缩到一个目录。
  进入源码目录,按照以下顺序,依次注意这些文件:autogen.sh,configure。一个软件包,一般都会有configure文件,它用来测试编译环境,以及生成makefile文件,再次是autogen.sh。autogen.sh的作用也是检测你的编译工具和依赖关系包是否完整;Makefile是编译的目标文件,也就是 make的时候要找的文件!
  好了,依次运行以下命令(当然,是在这些命令存在的前提下)测试其是否满足依赖关系,并生成一些相关的打包必要文件:
./autogen.sh
./configure

4,满足编译所需要的依赖关系。
  编译的时候,你需要安装一些特别的包,以满足需要。这里假设你已经安装好了所有的编译工具,且没有任何遗漏,那么,在autogen.sh和 configure出错的时候,提示说XX包没有安装,请安装。那么,你要安装的是XX-dev,而不是XX!比如,configure指出你的 pidgin包没有安装,可能你还纳闷,早上还用pidgin和老外聊天,现在它怎么说我没有安装呢?这么想就想到死胡同里去了,实际上它指的是 pidgin-dev包,开发包没有安装。这是Linux软件编译的约定俗成,所以无论是系统提示还是官方说明,都不会特别指出是dev包,所以贻害了好多Linux菜鸟,看到编译就敬而远之。本人最开始也被此种说法所误导,今天才得以悟道成仙。
  这个过程是整个编译过程中最复杂、最辛苦的一部分。基本上,绝大部分编译不成功的问题,都是因为依赖关系没有得到很好的解决而造成的。当安装了编译所依赖的所有dev包的时候,一切问题都将迎刃而解。

5,注意configure和autogen.sh的错误。
  每次运行./configure,中途出错停下,都会提示有XX包没有安装,我们就大胆地安装这个包的dev包,同时,切记版本要和configure 提示的匹配,不然也是绝对无法过关的。所以,这方面debian的apt-get占了绝对优势,提供的都是新包。多次运行./configure,直到它不再有出错提示,最后说几个Makefile都顺利建立。那么,你的编译依赖关系就完全解决了。
  如果遇到一些小软件,没有configure文件,也不要慌张,看看README,需要什么依赖关系,安装相关的-dev包就是了。而且你直接make,如果不成功,也会给出缺少包的提示,根据包名装-dev包。

当./configure出现以下信息的时候,说明所有的依赖关系满足,可以编译了:
configure: creating ./config.status
config.status: creating Makefile
config.status: creating pixmaps/Makefile
config.status: creating src/Makefile
config.status: creating src/dieu.desktop
config.status: creating src/libdieu/Makefile
config.status: creating src/libdieu/gui/Makefile
config.status: creating src/libdieu/gui/about.py
config.status: creating src/libdieu/gui/add.py
config.status: creating src/libdieu/gui/browser.py
config.status: creating src/libdieu/gui/tray.py
config.status: creating src/libdieu/gui/prefs.py
config.status: creating config.h
carlos@bogon:~/build/dieu-0.5.5$ ls
结束的最后几行没有出现任何错误,且建立了Makefile

6,编译
  这次再make就绝对不会再出任何问题了。然后就是看着满屏幕的天书——英文字母、单词、各种符号不断变换着——这就是传说中的编译过程。你最好打开另一个tty玩会儿游戏。我的AMD Athlon 3800+双核、2GB内存,编译一个10MB的源码,大概要40分钟。make结束不出任何错误提示,就说明完全成功了。如果出现一个百分数,比如 97%,可能说明整个编译成功了97%,还有3%不成功。你可以选择重新编译,或者拿编译好的软件先碰碰运气,它现在已经在这个目录里可以使用了。

7,不要make install,要checkinstall。
  除非你想每次安装这个软件都编译一次,那么你就make install吧,没人拦着你。当然,像我们这些懒人,是不屑于每次编译的——说实话,一次都不想,有初次编译已经够恶心的了。所以,在安装的时候,建议使用checkinstall工具。
  输入sudo checkinstall,屏幕会给出一些软件包的相关细节,按数字1-9排列,如果你觉得软件名称或者版本需要修改,则输入相应的数字进行修改。不需要修改则输入回车。
  回车后,checkinstall要求你输入软件的说明。呵呵,这里要说明一下,第一行最好输入软件的全名,比如我这次编译的是webkit,就可以在第一行输入:WebKit Nightly Builds ver 36712。回车后,从第二行开始输入详细的describe。这样,当你安装好后,想用新立得自定义这个包的时候,就知道有什么好处了。赏心悦目的排版是每行不超过70个英文字母(含标点和空格)。
  再次回车,checkinstall将对你的软件全自动安装和全自动打包。当然,如果你只想打包,不想安装,则可以输入checkinstall(前面不加sudo),那么安装会失败,打包会成功。

8,额外的一些说明。
  (1)在编译好后,-dev包可以删除,但是尽量不要删除,因为这是编译工作的必备工具和法宝。是的,它占用了大量的空间,看着就难受(尤其是我个人,看着那么多-dev包,真是说不出的腻味呀),但是它同时给你带来的是创造的快乐,不是么?
  (2)你完全可以用DebCreator或者DebianPackageMaker出色地完成编译和打包工作,但是configure和满足编译的依赖关系的步骤,是他们无法替代你手工完成的。当然,他们的优点,可能是会使用更正宗、更原始的方法来打包,比如dh_make,而不是checkinstall。
  (3)由于本人使用Ubuntu,而且用得很业余,所以这里只提供一些debian相关的知识。如果大家有更高的需求,可以看看大侠Genokolar的这篇博文:http://genokolar.cn/blog/?p=210。俺当初找他学打包,就是看了这篇文章。不过最后还是给菜鸟推荐checkinstall的超级捷径。
  (4)本文只教菜鸟们如何急功近利地编译软件和打包,用的都是最通俗的语言和最简单的方法,如有不专业之处欢迎指正。

  昨天刚刚完成fcitx 3.6.2的编译,出现了一个新情况,就是configure通过了,但是make总是不成功。想了下,可能还是缺少某些包。于是检查每次make不成功,退出时结尾的一些单词——就是包名称了,然后按照那些包名称继续装-dev包,如果没有-dev包,就直接装非开发包。一般来说,只要把相关的包装全了,就会编译成功。不过,有些时候make出错后不提供包名字,也很让人恼火,呵呵。

这篇关于用通俗到业余水平的语言教你编译和打包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1087724

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端