我想在一台树莓派上编译 nginx,在执行 ./Configure 的时候发现 linux 缺少 openssl 、pcre 、zlib 等库,无法编译通过,采用 apt install 也没能安装上这些组件,非常无助。我主要不理解这个编译的过程,有几个问题想求教下:1 、openssl 、pcre 、zlib 这些组件如何可以安装到 linux 下, 他们是以什么形式存在于 linux 的那个目录下 2 、我看网上也有采用下载 openssl 、pcre 、zlib 源码的方式,在编译 nginx 的时候指定源码目录,这种方式和安装二进制的组件有什么异同 3 、nginx 编译后,是不是 这些组件也会编译进二进制程序中??不吝赐教
1
37Y37 2020-12-07 09:38:54 +08:00
直接 apt 安装即可,会自动安装所有依赖
|
2
bleepbloop 2020-12-07 09:42:45 +08:00
试一下是不是叫 openssl-dev 、pcre-dev 、zlib-dev 。。。。
另外 g++、make 、autoconf 之类应该也得装,不过树莓派可能自带 |
3
bleepbloop 2020-12-07 09:43:28 +08:00
或者 libopenssl 、libpcre 、libzlib 或者 libopenssl-dev 、libpcre-dev 、libzlib-dev
|
4
zliea 2020-12-07 09:52:54 +08:00
zlib1g openssl libpcre3
|
5
zliea 2020-12-07 09:56:26 +08:00
@ztechstack 回复错了,这个是直接安装 nginx 的依赖包,包名。
|
6
jimrok 2020-12-07 10:01:37 +08:00 1
因为 nginx 用的是静态编译,直接将这些代码编译进 nginx 里,不再依赖系统的库,这样保证进程的稳定性
|
7
mingl0280 2020-12-07 10:02:55 +08:00
树莓派不知道你用的啥系统,但是如果是 Debian 系极端不建议编译安装。debian 系就好好去用 apt install nginx
|
8
fanlis 2020-12-07 10:09:09 +08:00
编译安装 nginx 的时候,一般都是缺少哪个依赖,就单独去下载编译具体的依赖。确保在环境里面有依赖就行
这种直接搜索离线安装 nginx 就行,资料还挺多的 |
9
daijinming OP @fanlis 追问下朋友,比如我下载了 PCRE 的源码,是不是我要把 PCRE 编译成 .so 放到 lib64 就行??
|
10
aflow 2020-12-07 10:26:03 +08:00
只是想安装使用的话,用 docker 安装,方便快捷
|
11
smilzman 2020-12-07 10:34:54 +08:00
./configure --help 看一下,可以直接指定源码路径
-------------------------- --with-openssl=DIR --with-pcre=DIR --with-zlib=DIR DIR 是 openssl 等源码的路径~ |
12
fanlis 2020-12-07 10:47:14 +08:00
@daijinming
@smilzman #11 这样指定就行,其它的依赖直接 make make install 就行, 具体要看具体的依赖的安装位置,很多依赖的 install 默认路径本来就是 gcc 的环境中 |
13
Mecool 2020-12-07 10:47:35 +08:00 1
如果是 deb 系包管理工具,那就 apt install build-essential libpcre3 libpcre3-dev openssl libssl-dev 安装依赖
|
14
love 2020-12-07 10:56:07 +08:00
哪个 linux 没有带 nginx 包?
即使你要改一下编译参数,那也可以看一下此 linux 原始包编译脚本看看依赖什么库 |
15
diaryevil 2020-12-07 11:03:28 +08:00 1
说的简单点:
1. openssl,pcre 等组件(我一般把它们叫库),通过 apt-get install 获取的一般是“可执行的二进制+库文件”(有的可能连二进制都没有,有的 dev 库还会带各种头文件),比如 openssl,install 后你就可以使用 openssl 命令行了(可执行的命令行就是可执行二进制文件);存放位置常见的是 /usr/bin (二进制),/lib/(库文件)等等 2. 编译不需要可执行二进制文件,主要是要组件库,比方说 nginx 的 SSL 功能就需要 openssl 组件库,编译后这个库就会被编进去。所以下载组件源码后-->编译组件-->获得组件库-->编译 nginx 时候将组件库路径指定好(或者放在默认的 PATH 下)-->编译 nginx 就把组件带进去了,这是静态编译,动态编译会稍微有些不同 3. 当然,你要是采用动态编译的方式,你自己了解之后自行定夺,就像 6L 说的,静态编译不再依赖系统的库,动态编译放弃了这方面的稳定性换来一定程度上的自主性。 |
17
0ZXYDDu796nVCFxq 2020-12-07 11:16:12 +08:00 via Android
更正 jimrok 的说法
dev 或 devel 的包并不提供源码,只有头文件 只是告诉编译器,系统的这些动态链接库有哪些变量、函数等等 静态编译依赖库需要下载包的源码并在编译过程中编译这些库并静态链接进 nginx 的二进制文件 |
19
creanme 2020-12-07 11:23:43 +08:00 via Android
别编译了,以前我不懂,照着 csdn 上面写的编译 nginx,在云服务器上编译了一个多小时都没编译好,而且服务器直接给我限制了 cpu 频率。
|
20
vincenttone 2020-12-07 12:22:18 +08:00
是因为你编译 nginx 需要依赖这些库,所以你需要编译这些库,也就是自己下对应的源码再编译一下,路径的话默认路径就可以了。
还可以直接使用对应的软件管理器安装,具体看你的 linux 发行版( debian 的 apt 、centos 的 yum 、arch 的 pacman 等),可以使用对应的命令 search 一下 dev 包,比如 openssl-dev 之类的,不同的包管理器名字不一样,安装完编译就可以了。 也可以干脆直接使用包管理器安装 nginx,不一定需要自行编译,还要考虑依赖。自己编译可能为了更好的掌控或者研究源码,不然胡乱./configure 你自己都不知道你在做什么。 实在要自己编译,最好有点 c 语言和操作系统知识。 |
21
shlabc 2020-12-07 12:27:11 +08:00
mkdir -p /usr/local/src/pcre && cd /usr/local/src/pcre
chmod -R 777 /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz tar zvxf pcre-8.41.tar.gz cd pcre-8.41 ll ./configure --prefix=/usr/local/ins/pcre-8.41 make && make install ln -s /usr/local/ins/pcre-8.41 /usr/local/pcre -------------------------------------------------------------- 以上,是我在 centos6.10 下编译 nginx 依赖的一个例子,原理,上面的都说完了 zlib-1.2.11.tar.gz openssl-1.1.0g.tar.gz |
22
0ZXYDDu796nVCFxq 2020-12-07 13:19:28 +08:00 2
@shlabc chmod -R 777 的勇士
这样干不会被开除吗 |
23
shlabc 2020-12-07 13:29:34 +08:00
|
25
huangmingyou 2020-12-07 16:38:33 +08:00 1
1. 确保 /etc/apt/sources.list 里面有 deb-src 开头的源设置
2. sudo apt build-dep nginx 就会把编译 nginx 需要的所有依赖文件都安装好。 |
26
huangmingyou 2020-12-07 16:39:35 +08:00 1
root@desktop:/home/hmy# apt build-dep nginx
正在读取软件包列表... 完成 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列 [新] 软件包将被安装: dh-systemd libluajit-5.1-dev libmhash-dev libpam0g-dev libperl-dev 升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 10 个软件包未被升级。 需要下载 2,566 kB/2,993 kB 的归档。 解压缩后会消耗 16.6 MB 的额外空间。 您希望继续执行吗? [Y/n] |
27
daijinming OP @Mecool 你给的这个命令不错,不过还差 zlib 找不到
|
28
daijinming OP @diaryevil 感谢分享
|
29
yklaxds 2020-12-08 01:14:21 +08:00 via Android
你这种需求试试 Gentoo… 如果不是非要 Linux,freebsd 也是可以的
|
30
buffzty 2020-12-08 01:39:16 +08:00 1
nginx 依赖那些是依赖他们的静态库或者动态库. 你用 apt install libxxx-dev 就能下载到, .so 和.a 会安装到 /usr/lib 目录
.h 头文件会安装到 /usr/include 目录. 这 2 个目录默认是在库搜索目录和头文件搜索目录里的,所以你不必指定库的目录. 如果你自己下载源码编译那么就要告诉系统去哪里找库文件(.so .a). 两者没有什么区别. 唯一的区别就是 apt 安装的库版本可能不是最新的, 你自己安装的可以是最新的. |
31
daijinming OP @buffzty 感谢分享
|