Autoconf中AC_CHECK_LIB依赖第三方库时FAIL
2015-07-17 11:40
555 查看
尝试在lighttpd中新增一个module时,发现configure是通过autoconf产生的,需要修改其中的configure.ac,这其中都是autoconf的语法,依葫芦画瓢,这里以zlib为例:
AC_CHECK_LIB(z, deflate, [func1],[func2])表示check libz中的函数deflate 是否正常,如果check OK则调用func1,如果失败则调用func2
这个check的过程可以参考config.log:
同样的code被移植到我们的lib上,但是结果却是fail,config.log会提示第三方库中的函数找不到,那么怎么办么?
通过查看libz的check过程,我们会发现,check中会把AC_CHECK_LIB的第一个参数作为lib name,前面增加"-l"来link,想到的是不是可以通过修改第一个参数达到link其它lib的目的,答案是肯定的。只是这个格式需要自己摸索一下:
首先测试的是直接加第三方库,譬如ssl的crypto,AC_CHECK_LIB修改为
AC_CHECK_LIB(z crypto, deflate, [], []),仍然提示Error,察看Error提示找不到lib "-lz crypto"
虽然这是一个坏消息,但是从这个Error中可以找到一些有用的信息,引导我们走向成功。就是看起来check时把第一个参数作为一个字符串,前面直接加"-l"来link,这就使我想到,是不是可以直接增加"-lcrypto"
其次测试的正是上面提到的增加完整的link "-lcrypto",AC_CHECK_LIB修改为:
AC_CHECK_LIB(z -lcrypto, deflate, [], []),测试通过,查看log,果然是 -lz -lcrypto
目前尚不知道这个做法是否合理,只是测试可用。
有其它建议,欢迎讨论。
AC_MSG_CHECKING(for zlib support) AC_ARG_WITH(zlib, AC_HELP_STRING([--with-zlib],[Enable zlib support for mod_compress]), [WITH_ZLIB=$withval],[WITH_ZLIB=yes]) AC_MSG_RESULT([$WITH_ZLIB]) if test "$WITH_ZLIB" != "no"; then AC_CHECK_LIB(z, deflate, [ AC_CHECK_HEADERS([zlib.h],[ Z_LIB=-lz AC_DEFINE([HAVE_LIBZ], [1], [libz]) AC_DEFINE([HAVE_ZLIB_H], [1]) ]) ]) if test x$Z_LIB = x; then AC_MSG_ERROR([zlib-headers and/or libs where not found, install them or build with --without-zlib]) fi fi AC_SUBST(Z_LIB)
AC_CHECK_LIB(z, deflate, [func1],[func2])表示check libz中的函数deflate 是否正常,如果check OK则调用func1,如果失败则调用func2
这个check的过程可以参考config.log:
configure:14511: checking for zlib support configure:14521: result: yes configure:14525: checking for deflate in -lz configure:14550: gcc -o conftest -Os -fstrict-aliasing -fstrict-overflow -I/include -D_REENTRANT -D__EXTENSIONS__ -L/lib conftest.c -lz >&5 configure:14550: $? = 0 configure:14559: result: yes可以看到,autoconf有创建一个conftest.c,compile并link来确认libz是否support。
同样的code被移植到我们的lib上,但是结果却是fail,config.log会提示第三方库中的函数找不到,那么怎么办么?
通过查看libz的check过程,我们会发现,check中会把AC_CHECK_LIB的第一个参数作为lib name,前面增加"-l"来link,想到的是不是可以通过修改第一个参数达到link其它lib的目的,答案是肯定的。只是这个格式需要自己摸索一下:
首先测试的是直接加第三方库,譬如ssl的crypto,AC_CHECK_LIB修改为
AC_CHECK_LIB(z crypto, deflate, [], []),仍然提示Error,察看Error提示找不到lib "-lz crypto"
虽然这是一个坏消息,但是从这个Error中可以找到一些有用的信息,引导我们走向成功。就是看起来check时把第一个参数作为一个字符串,前面直接加"-l"来link,这就使我想到,是不是可以直接增加"-lcrypto"
其次测试的正是上面提到的增加完整的link "-lcrypto",AC_CHECK_LIB修改为:
AC_CHECK_LIB(z -lcrypto, deflate, [], []),测试通过,查看log,果然是 -lz -lcrypto
目前尚不知道这个做法是否合理,只是测试可用。
有其它建议,欢迎讨论。
相关文章推荐
- Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE无法安装错误解决方案
- How-to: enable fair scheduler in hadoop
- Jmeter性能测试NoHttpResponseException (the target server failed to respond)
- 启动Genymotion时报错Failed to initialize backend EGL display
- Pick a Self-Contained Set of Tablespaces(自包含)
- fail to register notify:Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的授权字符串"
- Gem总结
- Baidu地图之removeEventListener失效问题
- gtk程序运行报 main_loop!=NULL 错误的解决办法
- gtk程序运行报 main_loop!=NULL 错误的解决办法
- gtk程序运行报 main_loop!=NULL 错误的解决办法
- 奔跑吧,飞邮!TurboMail全面进军移动邮件系统
- Partition(hdu4651)2013 Multi-University Training Contest 5
- hdu 4308 Saving Princess claire(BFS)
- Partition(hdu4651)2013 Multi-University Training Contest 5----(整数拆分一)
- Unable to open log device ‘/dev/log/main’: No such file or directory
- 万全R630服务器组装RAID5阵列
- 由现实世界到抽象世界
- AIX PASE 和unix
- error: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) Unable t