饭店引流方法,源码怎么用,hbuilder移动app教程

Linux 发行版的一个最大的优点就是它的包治理器和相关的软件库。通过它们提供的资源和工具,你才能够以完全自动化的方式在你的盘算机上下载和安装软件。

然则,只管付出了许多的起劲,包维护者仍然没法照顾好每种情形,也不能能将所有的可用软件都打包进去。因此,仍然存在需要你自已去编译和安装一个新软件的情形。对于我来说,到目前为止,最主要的缘故原由是,我编译一些软件是我需要去运行一个特定的版本。或者是我想去修改源代码或使用一些想要的编译选项。

若是你也属于后一种情形,那你已经知道你应该怎么做了。然则,对于绝大多数的 Linux 用户来说,第一次从源代码中编译和安装一个软件看上去像是一个入门仪式:它让许多人感到恐惧;然则,若是你能克服难题,你将可能进入一个全新的天下,而且,若是你做到了,那么你将成为社区中享有特权的一部门人。

◈ 建议阅读:怎样在 Ubuntu 中安装和删除软件(完全指南)[1]

A. 在 Linux 中从源代码最先安装软件

这正是我们要做的。由于这篇文章的需要,我要在我的系统上安装 NodeJS[2] 8.1.1。它是个完全真实的版本。这个版本在 Debian 堆栈中没有:

sh$ apt-cache madison nodejs | grep amd64 nodejs | 6.11.1~dfsg-1 | http://deb.debian.org/debian experimental/main amd64 Packages nodejs | 4.8.2~dfsg-1 | http://ftp.fr.debian.org/debian stretch/main amd64 Packages nodejs | 4.8.2~dfsg-1~bpo8+1 | http://ftp.fr.debian.org/debian jessie-backports/main amd64 Packages nodejs | 0.10.29~dfsg-2 | http://ftp.fr.debian.org/debian jessie/main amd64 Packages nodejs | 0.10.29~dfsg-1~bpo70+1 | http://ftp.fr.debian.org/debian wheezy-backports/main amd64 Packages

第 1 步:从 GitHub 上获取源代码

像大多数开源项目一样,NodeJS 的源代码可以在 GitHub:https://github.com/nodejs/node 上找到。

以是,我们直接最先吧。

详解若何用源代码安装软件,以及若何卸载它

The NodeJS official GitHub repository

若是你不熟悉 GitHub[4],git[5] 或者提到的其它 版本治理系统[6]包罗了这个软件的源代码,以及多年来对该软件的所有修改的历史。甚至可以回溯到该软件的最早版本。对于开发者来说,保留它的历史版本有许多利益。现在对我来说,其中一个利益是可以获得任何一个给定时间点的项目源代码。更准确地说,我可以获得我所要的 8.1.1 公布时的源代码。即便从那之后他们有了许多的修改。

详解若何用源代码安装软件,以及若何卸载它

Choose the v8.1.1 tag in the NodeJS GitHub repository

在 GitHub 上,你可以使用 “branch” (分支)按钮导航到这个软件的差别版本。“分支” 和 “标签” 是 Git 中一些相关的观点[7]。总的来说,开发者建立 “分支” 和 “标签” 来在项目历史中对重要事宜保持跟踪,好比当他们启用一个新特征或者公布一个新版本时。在这里先不详细先容了,你现在只需要知道我在找被标记为 “v8.1.1” 的版本。

详解若何用源代码安装软件,以及若何卸载它

The NodeJS GitHub repository as it was at the time the v8.1.1 tag was created

在选择了 “v8.1.1” 标签后,页面被刷新,最显著的转变是标签现在作为 URL 的一部门泛起。另外,你可能会注重到文件改变日期也有所差别。你现在看到的源代码树是建立了 v8.1.1 标签时的代码。在某种意义上,你也可以以为像 git 这样的版本治理工具是一个时光穿梭机,允许你在项目历史中往返穿梭。

详解若何用源代码安装软件,以及若何卸载它

NodeJS GitHub repository download as a ZIP button

此时,我们可以下载 NodeJS 8.1.1 的源代码。你不要遗忘去点谁人建议的大的蓝色按钮来下载一个项目的 ZIP 压缩包。对于我来说,为解说的目的,我从下令行中下载并解压这个 ZIP 压缩包。然则,若是你更喜欢使用一个 GUI[8] 工具,不用忧郁,你可以取代下面的下令方式:

wget https://github.com/nodejs/node/archive/v8.1.1.zipunzip v8.1.1.zipcd node-8.1.1/

下载一个 ZIP 包就可以,然则若是你希望“像个专家一样”,我建议你直接使用 git 工具去下载源代码。它一点也不庞大 — 而且若是你是第一次使用该工具,它将是一个很好的劈头,你以后将经常用到它:

# first ensure git is installed on your systemsh$ sudo apt-get install git# Make a shallow clone the NodeJS repository at v8.1.1sh$ git clone --depth 1  --branch v8.1.1  https://github.com/nodejs/nodesh$ cd node/

顺便说一下,若是你有任何问题,这篇文章的第一部门只是做一个总体先容而已。后面,为了帮你清扫常见问题,我们将基于 Debian 和基于 RedHat 的发行版更详细地注释。

不管怎样,在你使用 git 或者作为一个 ZIP 压缩包下载了源代码后,在当前目录下就有了同样的源代码文件:

sh$ lsandroid-configure BUILDING.md common.gypi doc Makefile srcAUTHORS CHANGELOG.md configure GOVERNANCE.md node.gyp testbenchmark CODE_OF_CONDUCT.md CONTRIBUTING.md lib node.gypi toolsBSDmakefile COLLABORATOR_GUIDE.md deps LICENSE README.md vcbuild.bat

第 2 步:明了程序的构建系统

构建系统就是我们通常所说的“编译源代码”,实在,编译只是从源代码中天生一个可使用的软件的其中一个阶段。构建系统是一套工具,用于自动处置差别的义务,以便可以仅通过几个下令就能构建整个软件。

虽然观点很简朴,现实上编译做了许多事情。由于差别的项目或者编程语言也许有差别的要求,或者由于编程者的好恶,或者由于支持的平台、或者由于历史的缘故原由,等等等等 … 选择或建立另外一个构建系统的缘故原由险些数不清。这方面有许多种差别的解决方案。

NodeJS 使用一种 GNU 气概的构建系统[9]。这在开源社区中这是一个很盛行的选择。由此最先,你将进入一段精彩的旅程。

写出和调优一个构建系统是一个异常庞大的义务。然则,作为 “终端用户” 来说,GNU 气概的构建系统使用两个工具让他们免于此难:configuremake

configure 文件是个项目专用的剧本,它将检查目的系统的设置和可用功效,以确保该项目可以被构建,并最终吻合当前平台的特征。

一个典型的 configure 义务的重要部门是去构建 Makefile。这个文件包罗了有用构建项目所需的指令。

另一方面,make 工具[10],这是一个可用于任何类 Unix 系统的 POSIX 工具。它将读取项目专用的 Makefile 然后执行所需的操作去构建和安装你的程序。

然则,在 Linux 的天下中,你仍然有一些定制你自己专用的构建的理由。

./configure --help

configure -help 下令将展示你可用的所有设置选项。再强调一下,这是异常的项目专用。说实话,有时刻,在你完全明了每个设置选项的作用之前,你需要深入到项目中去好好研究。

不外,这里至少有一个尺度的 GNU 自动化工具选项是你该知道的,它就是众所周知的 --prefix 选项。它与文件系统的条理结构有关,它是你软件要安装的位置。

第 3 步:文件系统条理化尺度(FHS)

大部门典型的 Linux 发行版的文件系统条理结构都遵从 文件系统条理化尺度(FHS)[11]。

这个尺度说明晰你的系统中种种目录的用途,好比,/usr/tmp/var 等等。

当使用 GNU 自动化工具 和大多数其它的构建系统 时,它会把新软件默认安装在你的系统的 /usr/local 目录中。这是依据 FHS 中 “/usr/local 层级是为系统治理员内陆安装软件时使用的,它在系统软件更新笼罩时是平安的。它也可以用于存放在一组主机中共享,但又没有放到 /usr 中的程序和数据”,因此,它是一个异常好的选择。

/usr/local 层级以某种方式复制了根目录,你可以在 /usr/local/bin 这里找到可执行程序,在 /usr/local/lib 中找到库,在 /usr/local/share 中找到架构无关的文件,等等。

使用 /usr/local 树作为你定制安装的软件位置的唯一问题是,你的软件的文件将在这里混杂在一起。尤其是你安装了多个软件之后,将很难去准确地跟踪 /usr/local/bin/usr/local/lib 中的哪个文件到底属于哪个软件。它虽然不会导致系统的问题。究竟,/usr/bin 也是一样杂乱的。然则,有一天你想去卸载一个手工安装的软件时它会将成为一个问题。

要解决这个问题,我通常喜欢安装定制的软件到 /opt 子目录下。再次引用 FHS:

/opt 是为安装附加的应用程序软件包而保留的。

包安装在 /opt 下的软件包必须将它的静态文件放在单独的 /opt/<package> 或者 /opt/<provider> 目录中,此处 <package> 是所说的谁人软件名的名字,而 <provider> 处是提供者的 LANANA 注册名字。”(LCTT 译注:LANANA 是指 The Linux Assigned Names And Numbers Authority[12]。 )

因此,我们将在 /opt 下建立一个子目录,用于我们定制的 NodeJS 安装。而且,若是有一天我想去卸载它,我只是很简朴地去删除谁人目录:

sh$ sudo mkdir /opt/node-v8.1.1sh$ sudo ln -sT node-v8.1.1 /opt/node# What is the purpose of the symbolic link above?# Read the article till the end--then try to answer that# question in the comment section!sh$ ./configure --prefix=/opt/node-v8.1.1sh$ make -j9 && echo ok# -j9 means run up to 9 parallel tasks to build the software.# As a rule of thumb, use -j(N+1) where N is the number of cores# of your system. That will maximize the CPU usage (one task per# CPU thread/core + a provision of one extra task when a process# is blocked by an I/O operation.

在你运行完成 make 下令之后,若是有任何的除了 “ok” 以外的信息,将意味着在构建历程中有错误。当我们使用一个 -j 选项去运行并行构建时,在构建系统的大量输出历程中,检索错误信息并不是件很容易的事。

在这种情形下,只能是重新最先 make,而且不要使用 -j 选项。这样错误将会泛起在输出信息的最后面:

sh$ make

最终,编译竣事后,你可以运行这个下令去安装你的软件:

sh$ sudo make install

然后测试它:

sh$ /opt/node/bin/node --versionv8.1.1

B. 若是在源代码安装的历程中泛起错误怎么办?

网络电视盒子哪个好,2019电视盒子对比评测

我上面先容的大多是你能在文档完整的项目的“构建指令”页面上看到。然则,本文的目的是让你从源代码最先去编译你的第一个软件,它可能要花一些时间去研究一些常见的问题。因此,我将再次重新最先一遍整个历程,然则,这次是在一个最新的、最小化安装的 Debian 9.0 和 CentOS 7.0 系统上。因此,你可能看到我遇到的错误以及我怎么去解决它。

从 Debian 9.0 中 “Stretch” 最先

itsfoss@debian:~$ git clone --depth 1  --branch v8.1.1  https://github.com/nodejs/node-bash: git: command not found

这个问题异常容易去诊断和解决。去安装这个 git 包即可:

itsfoss@debian:~$ sudo apt-get install git
itsfoss@debian:~$ git clone --depth 1  --branch v8.1.1  https://github.com/nodejs/node && echo ok[...]ok
itsfoss@debian:~/node$ sudo mkdir /opt/node-v8.1.1itsfoss@debian:~/node$ sudo ln -sT node-v8.1.1 /opt/node

现在没有问题了。

itsfoss@debian:~/node$ ./configure --prefix=/opt/node-v8.1.1/WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix.

很显然,编译一个项目,你需要一个编译器。NodeJS 是使用 C++ 语言[13] 写的,我们需要一个 C++ 编译器[14]。在这里我将安装 g++,它就是为这个目的写的 GNU C++ 编译器:

itsfoss@debian:~/node$ sudo apt-get install g++itsfoss@debian:~/node$ ./configure --prefix=/opt/node-v8.1.1/ && echo ok[...]ok
itsfoss@debian:~/node$ make -j9 && echo ok-bash: make: command not found

还差一个其它工具。同样的症状。同样的解决方案:

itsfoss@debian:~/node$ sudo apt-get install makeitsfoss@debian:~/node$ make -j9 && echo ok[...]ok
itsfoss@debian:~/node$ sudo make install[...]itsfoss@debian:~/node$ /opt/node/bin/node --versionv8.1.1

乐成!

请注重:我将一次又一次地安装种种工具去展示怎么去诊断编译问题,以及展示怎么去解决这些问题。然则,若是你搜索关于这个主题的更多文档,或者读其它的教程,你将发现,许多发行版有一个 “meta-packages”,它包罗了安装一些或者所有的用于编译软件的常用工具。在基于 Debian 的系统上,你或许遇到过 build-essentials[15] 包,它就是这种用作。在基于 Red Hat 的发行版中,它将是 “Development Tools” 组。

在 CentOS 7.0 上

[itsfoss@centos ~]$ git clone --depth 1  --branch v8.1.1  https://github.com/nodejs/node-bash: git: command not found

下令没有找到?可以用 yum 包治理器去安装它:

[itsfoss@centos ~]$ sudo yum install git
[itsfoss@centos ~]$ git clone --depth 1  --branch v8.1.1  https://github.com/nodejs/node && echo ok[...]ok
[itsfoss@centos ~]$ sudo mkdir /opt/node-v8.1.1[itsfoss@centos ~]$ sudo ln -sT node-v8.1.1 /opt/node
[itsfoss@centos ~]$ cd node[itsfoss@centos node]$ ./configure --prefix=/opt/node-v8.1.1/WARNING: failed to autodetect C++ compiler version (CXX=g++)WARNING: failed to autodetect C compiler version (CC=gcc)Node.js configure error: No acceptable C compiler found! Please make sure you have a C compiler installed on your system and/or consider adjusting the CC environment variable if you installed it in a non-standard prefix.

你知道的:NodeJS 是使用 C++ 语言写的,然则,我的系统缺少合适的编译器。Yum 可以帮到你。由于,我不是一个及格的 CentOS 用户,我现实上是在互联网上搜索到包罗 g++ 编译器的包简直切名字的。这个页面指导了我:https://superuser.com/questions/590808/yum-install-gcc-g-doesnt-work-anymore-in-centos-6-4 。

[itsfoss@centos node]$ sudo yum install gcc-c++[itsfoss@centos node]$ ./configure --prefix=/opt/node-v8.1.1/ && echo ok[...]ok
[itsfoss@centos node]$ make -j9 && echo ok[...]ok
[itsfoss@centos node]$ sudo make install && echo ok[...]ok
[itsfoss@centos node]$ /opt/node/bin/node --versionv8.1.1

再次乐成!

C. 从源代码中对要安装的软件做一些改变

从源代码中安装一个软件,可能是由于你的分发堆栈中没有一个可用的特定版本。或者由于你想去 修改 谁人程序。也可能是修复一个 bug 或者增添一个特征。究竟,开源软件这些都可以做到。因此,我将捉住这个机遇,让你亲自体验怎么去编译你自己的软件。

在这里,我将在 NodeJS 源代码上做一个细小改变。然后,我们将看到我们的改变将被纳入到软件的编译版本中:

用你喜欢的 文本编辑器[17](如,vim、nano、gedit、 … )打开文件 node/src/node.cc。然后,实验找到如下的代码片断:

 if (debug_options.ParseOption(argv[0], arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) { printf("%sn", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp(); exit(0); }

它在 文件的 3830 行[18] 四周。然后,修改包罗 printf 的行,将它替换成如下内容:

 printf("%s (compiled by myself)n", NODE_VERSION);

然后,返回到你的终端。在继续之前,为了对壮大的 Git 支持有更多的领会,你可以去检查一下,你修改是文件是否准确:

diff --git a/src/node.cc b/src/node.ccindex bbce1022..a5618b57 100644--- a/src/node.cc+++ b/src/node.cc@@ -3828,7 +3828,7 @@ static void ParseArgs(int* argc, if (debug_options.ParseOption(argv[0], arg)) { // Done, consumed by DebugOptions::ParseOption(). } else if (strcmp(arg, "--version") == 0 || strcmp(arg, "-v") == 0) {- printf("%sn", NODE_VERSION);+ printf("%s (compiled by myself)n", NODE_VERSION); exit(0); } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { PrintHelp();

在你前面改变的那行之前,你将看到一个 “-” (减号标志)。而在改变之后的行前面有一个 “+” (加号标志)。

现在可以去重新编译并重新安装你的软件了:

make -j9 && sudo make install && echo ok[...]ok

这个时刻,可能失败的唯一缘故原由就是你改变代码时的输入错误。若是就是这种情形,在文本编辑器中重新打开 node/src/node.cc 文件并修复错误。

一旦你完成了新修改版本的 NodeJS 的编译和安装,就可以去检查你的修改是否包罗到软件中:

itsfoss@debian:~/node$ /opt/node/bin/node --versionv8.1.1 (compiled by myself)

恭喜你!你对开源程序做出了你的第一个改变!

D. 让 shell 找到我们定制构建的软件

到目前为止,你可能注重到,我通常启动我新编译的 NodeJS 软件是通过指定到该二进制文件的绝对路径。

/opt/node/bin/node

这是可以正常事情的。然则,这样太贫苦。现实上有两种设施可以去解决这个问题。然则,去明了它们,你必须首先明了,你的 shell 定位可执行文件是通过在环境变量[19] PATH 中指定的目录内里查找的。

itsfoss@debian:~/node$ echo $PATH/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

在这个 Debian 系统上,若是你不指定一个正确的目录做为下令名字的一部门,shell 将首先在 /usr/local/bin 中查找可执行程序;若是没有找到,然后进入 /usr/bin 中查找;若是没有找到,然后进入 /bin查找;若是没有找到,然后进入 /usr/local/games查找;若是没有找到,然后进入 /usr/games 查找;若是没有找到,那么,shell 将讲述一个错误,“command not found”。

由此,我们可以知道有两种方式去确保下令可以被 shell 访问到:将它(该二进制程序)增添到已经设置好的 PATH 目录中,或者将包罗可执行程序的目录添加到 PATH 中。

从 /usr/local/bin 中添加一个链接

只是从 /opt/node/bin 中 拷贝 NodeJS 二进制可执行文件到 /usr/local/bin 是一个错误的做法。由于,若是这么做,该可执行程序将无法定位到在 /opt/node/ 中的需要的其它组件。(软件以它自己的位置去定位它所需要的资源文件是常见的做法)

因此,传统的做法是去使用一个符号链接:

itsfoss@debian:~/node$ sudo ln -sT /opt/node/bin/node /usr/local/bin/nodeitsfoss@debian:~/node$ which -a node || echo not found/usr/local/bin/nodeitsfoss@debian:~/node$ node --versionv8.1.1 (compiled by myself)

这一个简朴而有用的解决设施,尤其是,若是一个软件包是由好几个众所周知的可执行程序组成的,由于,你将为每个用户挪用的下令建立一个符号链接。例如,若是你熟悉 NodeJS,你知道应用的 npm 组件,也应该从 /usr/local/bin 做个符号链接。我把这个留给你做演习。

修改 PATH

首先,若是你实验过前面的解决方案,请先移除前面建立的节点符号链接,去从一个清洁的状态最先:

itsfoss@debian:~/node$ sudo rm /usr/local/bin/nodeitsfoss@debian:~/node$ which -a node || echo not foundnot found

现在,这里有一个改变你的 PATH 的邪术下令:

itsfoss@debian:~/node$ export PATH="/opt/node/bin:${PATH}"itsfoss@debian:~/node$ echo $PATH/opt/node/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

简朴说就是,我用环境变量 PATH 之前的内容前缀了一个 /opt/node/bin 替换了其原先的内容。因此,你可以想像一下,shell 将先进入到 /opt/node/bin 目录中查找可执行程序。我们也可以使用 which 下令去确认一下:

itsfoss@debian:~/node$ which -a node || echo not found/opt/node/bin/nodeitsfoss@debian:~/node$ node --versionv8.1.1 (compiled by myself)

鉴于 “符号链接” 解决方案是永远的,只要建立到 /usr/local/bin 的符号链接就行了,而对 PATH 的改变仅影响到当前的 shell。你可以自己做一些研究,若何做到对 PATH 的永远改变。给你一个提醒,可以将它写到你的 “profile” 中。若是你找到这个解决方案,不要犹豫,通过下面的谈论区共享给其它的读者!

E. 怎么去卸载适才从源代码中安装的软件

由于我们定制编译的 NodeJS 软件所有在 /opt/node-v8.1.1 目录中,卸载它不需要做太多的事情,仅使用 rm 下令去删除谁人目录即可:

sudo rm -rf /opt/node-v8.1.1

注重:sudorm -rf 是 “异常危险的鸡尾酒”!一定要在按下回车键之前多检查几回你的下令。你不会获得任何简直认信息,而且若是你删除了错误的目录它是不能恢复的 …

然后,若是你修改了你的 PATH,你可以去恢复这些改变。它一点也不庞大。

若是你从 /usr/local/bin 建立了一个符号链接,你应该去删除它们:

itsfoss@debian:~/node$ sudo find /usr/local/bin  -type l  -ilname "/opt/node/*"  -print -delete/usr/local/bin/node

等等? 依赖地狱在那里?

作为最终的讨论,若是你读过有关的编译定制软件的文档,你可能听到关于 依赖地狱dependency hell[20] 的说法。那是在你能够乐成编译一个软件之前,对那种烦人情形的一个别名,你必须首先编译一个前提条件所需要的库,它又可能要求其它的库,而这些库有可能与你的系统上已经安装的其它软件不兼容。

发行版的软件包维护者的部门事情,就是现实去地解决那些依赖地狱,确保你的系统上的种种软件都使用了兼容的库,而且按准确的顺序去安装。

在这篇文章中,我特意选择了 NodeJS 去安装,是由于它险些没有依赖。我说 “险些” 是由于,现实上,它 有 依赖。然则,这些源代码的依赖已经预置到项目的源堆栈中(在 node/deps 子目录下),因此,在你着手编译之前,你不用手动去下载和安装它们。

本文来源于自互联网,不代表n5网立场,侵删。发布者:虚拟资源中心,转载请注明出处:https://www.n5w.com/227357.html

(0)
打赏 微信扫一扫 微信扫一扫
虚拟资源中心虚拟资源中心网络小白
上一篇 2020年6月28日 15:42
下一篇 2020年6月28日 15:42

相关推荐

联系我们

电话:

在线咨询:点击这里给我发消息

邮件:@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

公众号