Autoconf中AC_CHECK_LIB依赖第三方库时FAIL

本文转自:http://blog.csdn.net/jtujtujtu/article/details/46924225


尝试在lighttpd中新增一个module时,发现configure是通过autoconf产生的,需要修改其中的configure.ac,这其中都是autoconf的语法,依葫芦画瓢,这里以zlib为例:

[plain] view plain copy
  1. AC_MSG_CHECKING(forzlibsupport)
  2. AC_ARG_WITH(zlib,AC_HELP_STRING([--with-zlib],[Enablezlibsupportformod_compress]),
  3. [WITH_ZLIB=$withval],[WITH_ZLIB=yes])
  4. AC_MSG_RESULT([$WITH_ZLIB])
  5. iftest"$WITH_ZLIB"!="no";then
  6. AC_CHECK_LIB(z,deflate,[
  7. AC_CHECK_HEADERS([zlib.h],[
  8. Z_LIB=-lz
  9. AC_DEFINE([HAVE_LIBZ],[1],[libz])
  10. AC_DEFINE([HAVE_ZLIB_H],[1])
  11. ])
  12. ])
  13. iftestx$Z_LIB=x;then
  14. AC_MSG_ERROR([zlib-headersand/orlibswherenotfound,installthemorbuildwith--without-zlib])
  15. fi
  16. fi
  17. AC_SUBST(Z_LIB)

AC_CHECK_LIB(z,[func1],[func2])表示check libz中的函数deflate 是否正常,如果check OK则调用func1,如果失败则调用func2

这个check的过程可以参考config.log:

copy

    configure:14511:checkingforzlibsupport
  1. configure:14521:result:yes
  2. configure:14525:checkingfordeflatein-lz
  3. configure:14550:gcc-oconftest-Os-fstrict-aliasing-fstrict-overflow-I/include-D_REENTRANT-D__EXTENSIONS__-L/libconftest.c-lz>&5
  4. configure:14550:$?=0
  5. 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,[],[]),仍然提示Error,察看Error提示找不到lib "-lz crypto" 虽然这是一个坏消息,但是从这个Error中可以找到一些有用的信息,引导我们走向成功。就是看起来check时把第一个参数作为一个字符串,前面直接加"-l"来link,这就使我想到,是不是可以直接增加"-lcrypto" 其次测试的正是上面提到的增加完整的link "-lcrypto",AC_CHECK_LIB修改为: AC_CHECK_LIB(z -lcrypto,[]),测试通过,查看log,果然是 -lz -lcrypto 目前尚不知道这个做法是否合理,只是测试可用。 有其它建议,欢迎讨论。

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...