我是Autotools
的初学者。我已经写了一些工作configure
脚本来调用Makefile
。所以,我想通过添加一些预编译检查来使我的configure
脚本更健壮。
例如,我尝试检查configure
脚本是否能够链接pthread
。
AC_TRY_LINK([#include <pthread.h>],[pthread_attr_t *attr=NULL; pthread_attr_init(attr);],[AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])
输出为:yes
稍后,我尝试按照上面显示的相同方式链接libssh2
。
AC_TRY_LINK([#include <libssh2.h>],[LIBSSH2_SESSION *session;session = libssh2_session_init();],[AC_MSG_RESULT(libssh2_session_init() worked)],[AC_MSG_RESULT(libssh2_session_init did not work)])
但此宏的输出显示:libssh2_session_init did not work
。
我尝试运行基于libssh2
的示例代码,但它确实有效。请看下面:
libsshex.c
#include <libssh2.h>
#include <stdio.h>
int main()
{
LIBSSH2_SESSION *session;
session = libssh2_session_init();
if(session)
printf("session initiated\n");
else
printf("session failed\n");
return 0;
}
编译和运行:
root@rohit-Precision-T1500:/test# gcc libsshex.c -lssh2
root@rohit-Precision-T1500:/test# ./a.out
session initiated
root@rohit-Precision-T1500:/test#
正如您在上面所看到的那样,链接是成功的。
那么,为什么AC_TRY_LINK
在libssh2
的情况下没有链接?请帮我解决这个问题。
答案 0 :(得分:0)
您可能真的想要AC_CHECK_LIB而不是AC_TRY_LINK
:
AC_CHECK_LIB ([ssh2], [libssh2_session_init_ex],
[AC_MSG_RESULT(libssh2_session_init linked)],
[AC_MSG_RESULT(libssh2_session_init did not link)])
不同之处在于AC_CHECK_LIBS
会在尝试编译和链接之前将-lssh2
添加到LIBS
。 AC_TRY_LINK
没有这样做,它只是执行编译和链接步骤,使用LIBS
中发生的任何事情,在这种情况下可能没什么。
顺便说一下,你可能想要至少检查POSIX线程的AX_PTHREAD宏。