如何从源代码构建 libcurl-gnutls.so

问题描述

在哪里可以找到构建 libcurl-gnutls.so 的源代码和说明?

我正在开发一个需要 libcurl-gnutls.so 的项目。我需要从源代码构建它 - 我不能简单地使用“apt-get install libcurl”安装它。不幸的是,我的 google-fu 失败了,我无法在任何地方找到源代码存储库或构建 libcurl-gnutls.so 的说明。

这是我发现的:

Linux-from-scratch 有关于构建 libcurl.so 的详细说明,在这里https://www.linuxfromscratch.org/blfs/view/svn/basicnet/curl.html。这让我可以使用 gnutls 构建 libcurl.so,但不能使用 libcurl-gnutls.so

curl 网站 (curl.se) 在此处提供了有关其各种选项的详细说明:https://curl.se/docs/install.html。这些向我展示了如何使用 gnutls 构建 libcurl,但最终产品仍然是 libcurl.so,而不是 libcurl-gnutls.so

当我在我的项目上运行 ldd -r 时,它会识别它需要的函数(curl_easy_init、curl_easy_setopt、curl_easy_perform 和 curl_easy_cleanup)。我可以在 libcurl.so 和预先构建的 libcurl-gnutls.so 中找到这些符号。这让我怀疑 libcurl-gnutls.so libcurl.so,以不同的名称发布。但是,将 libcurl.so 重命名为 libcurl-gnutls.so 并不足以满足依赖性要求。我可以尝试更改 libcurl 项目以将其名称和版本设置为 libcurl-gnutls(不是说我知道该怎么做 - 我会四处看看直到我弄清楚),但我不知道这有多合适。

我在 Stack Overflow 上发现了另一个关于 libcurl-gnutls (How to create lib curl-gnutls.so.4) 的问题,但答案是通过 apt-get install 安装预构建版本,但我不允许这样做。

解决方法

libcurl-gnutls.so 实际上只是来自使用 gnutls 支持构建的 cURL。您可以在此处找到存储库:https://github.com/curl/curl

查看docs/INSTALL.md。它包含构建 cURL 所需的所有信息,特别是关于 Building from git 的部分。

这是您可能需要的片段:

./configure --with-openssl [--with-gnutls --with-wolfssl]
make
make test (optional)
make install
,

这是根据每个人的意见拼凑而成的完整答案(特别感谢 Knud Larsen 和 Wassim Dhif):

libcurl-gnutls.so is 只是 libcurl.so 用 gnutls 支持构建的。该项目的档案在这里:https://curl.se/download

  1. 通过编辑 libcurl.so 来更改构建 ltmain.sh 的 SONAME:

     if test -n "$soname_spec";
     then eval soname=\"$soname_spec\"
    

致:

    if test -n "$soname_spec"; then
    soname=libcurl-gnutls.so.4

我确信有一种更优雅的方式来做到这一点,但这很有效,我需要继续前进。

或者,您可以在构建 SONAME 后修改 libcurl.so

    patchelf –set-soname libcurl-gnutls.so.4 libcurl.so
  1. 检查您的客户端(需要 libcurl-gnutls.so 作为依赖项的程序或共享库),看看它是否需要版本信息。 例如,当我运行 objdump -p myprogram 时,我得到:

     Version References:
     required from libcurl-gnutls.so.4:
     0x0b103d23 0x00 14 CURL_GNUTLS_3
    

要使用此版本信息构建 libcurl-gnutls.so

2a。将版本信息设置为版本3: 在 lib/libcurl.vers. 中更改:

CURL_@CURL_LT_SHLIB_VERSIONED_FLAVOUR@4

致:

CURL_@CURL_LT_SHLIB_VERSIONED_FLAVOUR@3

2b。配置 libcurl 项目时使用 --enable-versioned-symbols。这会添加所需的版本信息。

./configure --with-gnutls --enable-versioned-symbols [other arguments as needed]

最终产品可能是名称 libcurl.so,但可以重命名。它将其 SONAME 设置为 libcurl-gnutls.so.4 并具有所需的版本信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...