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

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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论,编译64位报错,查了一圈没找到解决方案,最后换了32位的。 使用qt访问web接口,因为是https,没有openssl库会报错 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());if (reply){if (reply->error() == QNetworkReply::NoError

通俗范畴论4 范畴的定义

注:由于CSDN无法显示本文章源文件的公式,因此部分下标、字母花体、箭头表示可能会不正常,请读者谅解 范畴的正式定义 上一节我们在没有引入范畴这个数学概念的情况下,直接体验了一个“苹果1”范畴,建立了一个对范畴的直观。本节我们正式学习范畴的定义和基本性质。 一个范畴(Category) C𝐶,由以下部分组成: 数据: 对象(Objects):包含若干个对象(Objects),这些

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c2,c3,c4,c5这五个变量的值分别为“C”,“h”,“i”,“n”,“a”,经过运算,使c1,c2,c3,c4,c5分别变成“G”,“l”,“m”,“r”,“e”。分别用put

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级