如何从 LIB 中告诉 Autoconf“需要符号 A 或 B”?

Posted

技术标签:

【中文标题】如何从 LIB 中告诉 Autoconf“需要符号 A 或 B”?【英文标题】:How to tell Autoconf "require symbol A or B" from LIB? 【发布时间】:2017-01-10 04:14:06 【问题描述】:

我正在尝试配置Postgres 9.5.4 for OpenSSL 1.1.0。由于在 OpenSSL 1.1.0 中找不到 SSL_library_init,Configure 快要死了。 OpenSSL 1.1.0 提供OPENSSL_init_ssl 而不是SSL_library_init。所以 Autoconf 需要检查 SSL_library_initOPENSSL_init_ssl

Postgres 使用以下测试:

AC_CHECK_LIB(ssl, SSL_library_init, [], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL])])

如何修改该 [规则?] 以查找 SSL_library_initOPENSSL_init_ssl


天真地,我将configure.in 更改为以下内容,但不起作用。据我所知,我的更改被忽略了(即使在运行 autoreconf 之后):

AC_CHECK_LIB(ssl, SSL_library_init|OPENSSL_init_ssl, [], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL])])

这里是 Postgrs 配置命令:

$ ./configure --with-openssl --with-includes=/usr/local/ssl/include --with-libraries=/usr/local/ssl/lib

这是来自config.log的相关条目:

configure:8732: gcc -o conftest -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-Wno-unused-command-line-argument -I/usr/local/ssl/include
-L/usr/local/ssl/lib   -I/usr/local/ssl/include   -L/usr/local/ssl/lib
conftest.c -lssl  -lcrypto -lz -lreadline -lm  >&5
Undefined symbols for architecture x86_64:
  "_SSL_library_init", referenced from:
      _main in conftest-c0c2a1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
configure:8732: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "PostgreSQL"
| #define PACKAGE_TARNAME "postgresql"
| #define PACKAGE_VERSION "9.5.4"
| #define PACKAGE_STRING "PostgreSQL 9.5.4"
| #define PACKAGE_BUGREPORT "pgsql-bugs(at)postgresql(dot)org"
| #define PACKAGE_URL ""
| #define PG_MAJORVERSION "9.5"
| #define PG_VERSION "9.5.4"
| #define USE_INTEGER_DATETIMES 1
| #define DEF_PGPORT 5432
| #define DEF_PGPORT_STR "5432"
| #define BLCKSZ 8192
| #define RELSEG_SIZE 131072
| #define XLOG_BLCKSZ 8192
| #define XLOG_SEG_SIZE (16 * 1024 * 1024)
| #define ENABLE_THREAD_SAFETY 1
| #define PG_KRB_SRVNAM "postgres"
| #define USE_OPENSSL 1
| #define HAVE_LIBM 1
| #define HAVE_LIBREADLINE 1
| #define HAVE_LIBZ 1
| #define HAVE_SPINLOCKS 1
| #define HAVE_ATOMICS 1
| #define HAVE_LIBCRYPTO 1
| /* end confdefs.h.  */
| 
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char SSL_library_init ();
| int
| main ()
| 
| return SSL_library_init ();
|   ;
|   return 0;
| 
configure:8741: result: no
configure:8751: error: library 'ssl' is required for OpenSSL

【问题讨论】:

【参考方案1】:

这样的事情应该适合你:

ACCEPT_SSL_LIB="no"
AC_CHECK_LIB(ssl, OPENSSL_init_ssl, [ACCEPT_SSL_LIB="yes"])
AC_CHECK_LIB(ssl, SSL_library_init, [ACCEPT_SSL_LIB="yes"])
AS_IF([test "x$ACCEPT_SSL_LIB" = xno], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL])])

您可能需要另一个变量来告诉您要调用哪个 init 函数来设置 SSL,除非头文件中有一些宏魔法可以将其实际修复为正确的值。

【讨论】:

非常感谢。是的,源代码有一些特定于 OpenSSL 的宏魔法。症结(对我来说)是解决配置问题。【参考方案2】:

以@ldav1s 的回答为基础,这里是对configure.in 的更改,以获取过去的配置。修改configure.in 后,应运行autoreconf

$ git diff configure.in > configure.in.diff

$ cat configure.in.diff 
diff --git a/configure.in b/configure.in
index c878b4e..7ba7538 100644
--- a/configure.in
+++ b/configure.in
@@ -1112,10 +1112,16 @@ if test "$with_openssl" = yes ; then
   dnl Order matters!
   if test "$PORTNAME" != "win32"; then
      AC_CHECK_LIB(crypto, CRYPTO_new_ex_data, [], [AC_MSG_ERROR([library 'crypto' is required for OpenSSL])])
-     AC_CHECK_LIB(ssl,    SSL_library_init, [], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL])])
+     FOUND_SSL_LIB="no"
+     AC_CHECK_LIB(ssl, OPENSSL_init_ssl, [FOUND_SSL_LIB="yes"])
+     AC_CHECK_LIB(ssl, SSL_library_init, [FOUND_SSL_LIB="yes"])
+     AS_IF([test "x$FOUND_SSL_LIB" = xno], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL])])
   else
      AC_SEARCH_LIBS(CRYPTO_new_ex_data, eay32 crypto, [], [AC_MSG_ERROR([library 'eay32' or 'crypto' is required for OpenSSL])])
-     AC_SEARCH_LIBS(SSL_library_init, ssleay32 ssl, [], [AC_MSG_ERROR([library 'ssleay32' or 'ssl' is required for OpenSSL])])
+     FOUND_SSL_LIB="no"
+     AC_SEARCH_LIBS(OPENSSL_init_ssl, ssleay32 ssl, [FOUND_SSL_LIB="yes"])
+     AC_SEARCH_LIBS(SSL_library_init, ssleay32 ssl, [FOUND_SSL_LIB="yes"])
+     AS_IF([test "x$FOUND_SSL_LIB" = xno], [AC_MSG_ERROR([library 'ssleay32' or 'ssl' is required for OpenSSL])])
   fi
   AC_CHECK_FUNCS([SSL_get_current_compression])
 fi

【讨论】:

以上是关于如何从 LIB 中告诉 Autoconf“需要符号 A 或 B”?的主要内容,如果未能解决你的问题,请参考以下文章

编译/配置时如何指定额外的 include 和 lib 目录? (回复:自动配置/配置)

如何将编译器标志从 Autoconf 传递给 Automake?

使用 automake/autoconf 条件生成文件

autoconf/automake:基于库存在的条件编译?

如何告诉 py.test 跳过某些目录?

如何使用 MinGW / MSYS 升级到 autoconf 2.69