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

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

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整