Каков канонический способ сделать ссылку autoconf в сетевых библиотеках Solaris?

В Solaris при компиляции программы, использующей сокеты, необходимо связать ее с -lnsl -lsocket. Многие такие программы изначально были написаны для Linux (где дополнительные библиотеки не нужны), и поэтому не проверяют наличие этих библиотек в своих сценариях настройки, хотя это довольно простое дополнение. Что-то вроде этого (не проверено):

AC_SEARCH_LIBS(gethostbyname, nsl, , AC_MSG_ERROR([gethostbyname not found]))
AC_SEARCH_LIBS(connect, socket, , AC_MSG_ERROR([connect not found]))

Есть ли канонический способ сделать эту проверку? Может быть, даже включен в дистрибутив autoconf? Вы можете себе представить, что в этом есть довольно широко распространенная потребность, но Google не сказал мне.


person legoscia    schedule 27.10.2009    source источник


Ответы (2)


я думаю, что наиболее близким к каноническому способу проверки является AX_LIB_SOCKET_NSL макрос из архива Autoconf:

# ===========================================================================
#        http://www.nongnu.org/autoconf-archive/ax_lib_socket_nsl.html
# ===========================================================================
#
# SYNOPSIS
#
#   AX_LIB_SOCKET_NSL
#
# DESCRIPTION
#
#   This macro figures out what libraries are required on this platform to
#   link sockets programs.
#
#   The common cases are not to need any extra libraries, or to need
#   -lsocket and -lnsl. We need to avoid linking with libnsl unless we need
#   it, though, since on some OSes where it isn't necessary it will totally
#   break networking. Unisys also includes gethostbyname() in libsocket but
#   needs libnsl for socket().
#
# LICENSE
#
#   Copyright (c) 2008 Russ Allbery <[email protected]>
#   Copyright (c) 2008 Stepan Kasal <[email protected]>
#   Copyright (c) 2008 Warren Young <[email protected]>
#
#   Copying and distribution of this file, with or without modification, are
#   permitted in any medium without royalty provided the copyright notice
#   and this notice are preserved.

AU_ALIAS([LIB_SOCKET_NSL], [AX_LIB_SOCKET_NSL])
AC_DEFUN([AX_LIB_SOCKET_NSL],
[
        AC_SEARCH_LIBS([gethostbyname], [nsl])
        AC_SEARCH_LIBS([socket], [socket], [], [
                AC_CHECK_LIB([socket], [socket], [LIBS="-lsocket -lnsl $LIBS"],
                [], [-lnsl])])
])
person ax.    schedule 01.11.2009
comment
Спасибо, это то, что я ищу. Я не знал об архиве Autoconf :) - person legoscia; 02.11.2009

Я не могу припомнить ни одного готового кода, но обычно вы сначала хотите проверить, можете ли вы слинковать программу, вызывающую функцию gethostbyname(), без каких-либо дополнительных библиотек. Только если это не поможет, попробуйте библиотеку nsl.

Подобные вещи применяются, например. для библиотеки m.

person Community    schedule 27.10.2009
comment
Да, в этом и заключается идея использования AC_SEARCH_LIBS: сначала он пытается найти функцию без какой-либо библиотеки, а затем по очереди с каждой библиотекой в ​​списке. (Однако в моем коде оба списка содержат одну библиотеку.) - person legoscia; 27.10.2009