技术解析

linux 编译 curl 出错
0
2021-07-06 03:53:15
idczone

编译 curl make 死活不通过,唉
执行参数如下,谢谢各位帮忙看看

这一步一切正常
[email protected]:~/curl-7.45.0# ./configure --with-ssl

图片描述

make

一顿编译之后 ...... 然后出错了
../lib/.libs/libcurl.so: undefined reference to `SSLv2_client_method'
../lib/.libs/libcurl.so: undefined reference to `SSL_CTX_set_alpn_protos'
../lib/.libs/libcurl.so: undefined reference to `SSL_get0_alpn_selected'
collect2: error: ld returned 1 exit status
make[2]: *** [curl] Error 1
make[2]: Leaving directory `/root/curl-7.45.0/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/curl-7.45.0/src'
make: *** [all-recursive] Error 1

指定 openssl 的路径了吗

./configure --with-ssl 完了之后 ssl 已经是 enabled 状态了。也就是已经读取到了。

./configure --with-ssl=/usr/local/ssl 照样不行、

能指定 ssl 源码文件吗?可以的话试试,别依赖系统库

那还有种可能是你编译 openssl 的时候 sslv2 没开

./configure --with-ssl=~/openssl-OpenSSL_1_0_2d 似乎连 ssl 状态都是 no 了

openssl 自己编译的,是不是全局安装了。
你的情况可能是冲突:
1. 全局安装了 openssl 的 library 和 headers
2. curl 找到了 openssl ,用的是你自己安装的 header
3. curl 链接时,使用的是系统自带的 openssl lib

如果是这样的华,我重新编译下 openssl


系统是最小化安装的,什么基础工具包都没有,我一步一路撸过来的, openssl 系统一开始都没有的,我自己编译的

我也遇到这个问题了,原来是 debian 源里面装的 1.1 ,后来为了 nginx1.9.5 直接源码安装了 1.2 之后,每次编译 nginx 都要手动指定 openssl 源码库,不然就失败 不知道怎么搞

直接关了 sslv2 openssl 编译方法 ./config shared zlib no-ssl2 编译中

1.0.2 废弃了部分东西,你可以用 1.0.1 编译,编译完不安装,直接指定路径编译 Curl 。
https://www.openssl.org/news/changelog.html#x0

感觉你最后在 link 的时候,没有加上 -lssl

我记得编译 nginx 所依赖的 openssl 是不需要编译的,而是指定 openssl 源码路径,和安装不安装 openssl 没有关系。
好像以前的 nginx 版本需要编译 openssl ,你看下文档吧,记不太清了

直接关了 sslv2 openssl 编译方法 ./config shared zlib no-ssl2 编译 openssl
```
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v
```
然后然后~~~只是少了一行错误而已
```
../lib/.libs/libcurl.so: undefined reference to `SSL_CTX_set_alpn_protos'
../lib/.libs/libcurl.so: undefined reference to `SSL_get0_alpn_selected'
collect2: error: ld returned 1 exit status
make[2]: *** [curl] Error 1
make[2]: Leaving directory `/root/curl-7.45.0/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/curl-7.45.0/src'
make: *** [all-recursive] Error 1
```

一会试试 1.0.1

我在编译 1.9.5 的时候没加 openssl 的路径 仍然报错

果然好像少了 2 个错误
../lib/.libs/libcurl.so: undefined reference to `SSL_CTX_set_alpn_protos'
../lib/.libs/libcurl.so: undefined reference to `SSL_get0_alpn_selected'
我重新试试

./config shared zlib no-ssl2 使用这招 不编译 ssl2 就不会报../lib/.libs/libcurl.so: undefined reference to `SSLv2_client_method'这个错误, ssl2 不编译也没事吧,落伍的协议了

编译完不安装 还不如直接在 curl 里屏蔽掉这个功能吧?

你如果用的 centos ,静态库和动态库放的路径是 /usr/lib ,但是系统配置的库路径在 /usr/lib64 。不知道是不是这个原因

刚才看漏了,是 debian 啊。。

要不我也顺便也看看是不是这个关系

明显不是,哈哈

https://packages.debian.org/stretch/curl
dep: libcurl3-gnutls (= 7.45.0-1+b1)
你看官方都用 gnutls 口味了。
PS: 能不能给个编译 curl 的理由?

呃呃呃,需求要 openssl~~~~

我也想知道楼主为何要亲自编译 curl 。这比编译失败的原因要重要得多

主要是需要 openssl ,顺手撸了 curl , apt-get 的 curl 会自动下载 openssl

我觉得这么常见的需求 debian 应该有现成的包提供,比如 libcurl4-openssl-dev ?

版本太低了。。

可以不安装库到系统里面,静态编译进程序就可以了。

7.45 的版本,怎么就低了……
你认为那个 4 是 curl 的版本?我觉得你最好花时间了解一下自己用的操作系统的包管理,否则很容易浪费时间。

新人要先学基础,别那编译软件这种破事练手,浪费时间也学不到什么东西

apt-get 的 curl 版本是 7.25 openssl 是 2013 年的

没招,必须编译, apt-get 的 openssl 是 2013 年的

--with-ssl 要指明你的 openssl 编译地址。
如:我的安装在 /opt/openssl 加上去就 OK 了。
顺便吐槽一下这 CURL 和 OPENSSL 。 编译过程不能再当前目录进行,必须在别的目录。

“系统是最小化安装的,什么基础工具包都没有,我一步一路[-哔-]过来的, openssl 系统一开始都没有的,我自己编译的”
------------------------------------
好吧,看到这里我明白了你的乐趣所在。别用 Debian 了,向你推荐 Gentoo 和 Linux From Scratch 。另外 FreeBSD ports 也不错的,你可以指定 curl 是用 GNU TLS , WolfSSL 还是 OpenSSL 。

其实主要是 apt-get 下载的 curl 会带上的 openssl1.01e 2013 版本太低了

你用的 Debian wheezy ? 换 jessie 或者 stretch 或者 sid 都可以有更高的版本啊。
比如 sid 的是 1.0.2d

现在的需求就是 debian7 这样,所以死这里了 唉

lz ,讲一下你的需求,到底是自己折腾着玩才编译,还是说是哪个教程教的你编译安装,还是说自己需要官方源软件包没有的哪个特性,还是什么?
另外,需求是 debian7 ,是公司要求的吗?还是说之前是 debian7 ,自己没有信心升级?还是说其它工具依赖?还是怎么?
在服务器上, debian 最好使用最新的 stable 版本,这样问题很少。觉得 nginx 、 php 这些版本太低了的话可以加入 dot-deb 源。

用的 debian7 仅仅是 mongodb 没写有 debian8 的版本,所以才选的,虽然我知道兴许是可行的,但是项目决定选 debian7 。然后抱歉,用的不是世界上最好的语言,用的是 nodejs~~~ 唉,当时纯粹就是想更新下 openssl 的版本, apt-get 下来的版本太低了是 1.0.1E 2013 的

那你在 debian 7 上加入 debian-security 源和 dot-deb 源试一试。升级时候再看看 openssl 版本是否满足你的要求了。
加的时候注意 google 一下,看看怎么配置需要的仓库。
不过我还是很好奇,“项目决定选 debian7 ”是不是除了 mongodb 还有其它的工具依赖于老版本?
如果只是 mongodb 的依赖的的话,考虑一下现在就做好升级预案, mongodb 将来不久肯定会加入对 debian8 的支持的。

dot-deb 好像只是对 php nginx mysql 这类的支持较多。。。

如果是 openssl 不是安装在默认目录,就会报这个错,原因是 make 的时候会进行执行测试,此时查找到的 so 文件不是自己安装的。可以在 configure 之前使用如下命令解决:
export LDFLAGS="-Wl,-rpath=/path/to/openssl/lib"

数据地带为您的网站提供全球顶级IDC资源