libtool: link: you must specify an output file
今天白天安装apr,在make的时候报错:
make[1]: 正在进入目录 `/home/***/apr-1.4.6'
/bin/bash /home/***/apr-1.4.6/libtool --silent --mode=link gcc -g -O2 -pthread -DHAVE_CONFIG_H -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -I./include -I/home/liuli/apr-1.4.6/include/arch/unix -I./include/arch/unix -I/home/liuli/apr-1.4.6/include/arch/unix -I/home/liuli/apr-1.4.6/include -version-info -o libapr-.la -rpath /usr/local/apr/lib passwd/apr_getpass.lo strings/apr_cpystrn.lo strings/apr_fnmatch.lo strings/apr_snprintf.lo strings/apr_strings.lo strings/apr_strnatcmp.lo strings/apr_strtok.lo tables/apr_hash.lo tables/apr_tables.lo atomic/unix/builtins.lo atomic/unix/ia32.lo atomic/unix/mutex.lo atomic/unix/ppc.lo atomic/unix/s390.lo atomic/unix/solaris.lo dso/unix/dso.lo file_io/unix/buffer.lo file_io/unix/copy.lo file_io/unix/dir.lo file_io/unix/fileacc.lo file_io/unix/filedup.lo file_io/unix/filepath.lo file_io/unix/filepath_util.lo file_io/unix/filestat.lo file_io/unix/flock.lo file_io/unix/fullrw.lo file_io/unix/mktemp.lo file_io/unix/open.lo file_io/unix/pipe.lo file_io/unix/readwrite.lo file_io/unix/seek.lo file_io/unix/tempdir.lo locks/unix/global_mutex.lo locks/unix/proc_mutex.lo locks/unix/thread_cond.lo locks/unix/thread_mutex.lo locks/unix/thread_rwlock.lo memory/unix/apr_pools.lo misc/unix/charset.lo misc/unix/env.lo misc/unix/errorcodes.lo misc/unix/getopt.lo misc/unix/otherchild.lo misc/unix/rand.lo misc/unix/start.lo misc/unix/version.lo mmap/unix/common.lo mmap/unix/mmap.lo network_io/unix/inet_ntop.lo network_io/unix/inet_pton.lo network_io/unix/multicast.lo network_io/unix/sendrecv.lo network_io/unix/sockaddr.lo network_io/unix/socket_util.lo network_io/unix/sockets.lo network_io/unix/sockopt.lo poll/unix/epoll.lo poll/unix/kqueue.lo poll/unix/poll.lo poll/unix/pollcb.lo poll/unix/pollset.lo poll/unix/port.lo poll/unix/select.lo random/unix/apr_random.lo random/unix/sha2.lo random/unix/sha2_glue.lo shmem/unix/shm.lo support/unix/waitio.lo threadproc/unix/proc.lo threadproc/unix/procsup.lo threadproc/unix/signals.lo threadproc/unix/thread.lo threadproc/unix/threadpriv.lo time/unix/time.lo time/unix/timestr.lo user/unix/groupinfo.lo user/unix/userinfo.lo -lrt -lcrypt -lpthread -ldl
libtool: link: you must specify an output file
libtool: link: Try `libtool --help --mode=link' for more information.
make[1]: *** [libapr-.la] 错误 1
错误原因:
因为我自己linux服务器的DNS出了问题,不能wget下载。我就在windows上下载完软件包后为了偷懒就直接在windows上解压后,直接上传文件夹到linux上安装,这样就导致了上传文件夹中所有的可执行文件变成不可执行了。
而诱发这个报错的主要就是build/get-version.sh 脚本无法执行,获取libtool的版本时候失败,从而导致build/apr_rules.mk(此文件是./configure配置时调用前面的sh脚本生成的,由于解压后上传脚本没有可执行权利)中libtool的 $LINK 选项中有个 -version-info(apr-0.9.20版本是这样,我这还有个apr-1.4.6版本这个选项被换成了变量:$(LT_VERSION),这个变量在../Makefile中能找到) 后面的版本为空,而正常情况下我的0.9.20版本显示是:-version-info 9:20:9
所以出现这个报错:你最好确定下生成libtool配置文件中的version-info后面是否为空!
解决原因:
要么从LINK中删除-version-info的标志,这也算歪门邪道吧,不推荐~~~所以还是把解压包到linux下解压重新安装吧。
这样敲响了个警钟,linux下安装和配置东西,最好还是在linux下解压,不要到windows解压成文件夹后上传!!!
解决思路:
当时出现问题时既然是libtool报错:you must specify an output file,
1.首先我肯定跑到libtool脚本去查找这句代码:
case $output in
"")
$echo "$modename: you must specify an output file" 1>&2
但libtool代码还是还有多,加之也不是很熟悉shell脚本。看的有点晕,跟不出什么结果。。
2.既然是make的时候报错,而且错误码还包含了:link gcc -g ,所以就去查找Makefile文件,Makefile文件包含build/apr_rules.mk。进去后果然发现在这边libtool的link,但由于对libtool也不是很了解,所以下午又花了一下午时间了解libtool(http://www.cnblogs.com/samurail/archive/2013/04/27/3047569.html),跟着这篇文件操作完后我进行手动排错了,因为是libtool的link报错,而那篇文件进行link是:libtool --mode=link gcc -o libcompress.la compress.lo -rpath /tmp -lz,我就改成apr的link选项:gcc -g -O2 -pthread -DHAVE_CONFIG_H -D_REENTRANT -D_GNU_SOURCE -version-info -o libapr-.la -rpath /usr/local/apr/lib compress.lo,然后一个一个选项的删就排查到了version-info的问题。
至于versin-info为什么会导致这个报错的原因我现在也还没弄的很明白,这里(http://www.sourceware.org/autobook/autobook/autobook_91.html)有version-info的说明,有空在研究吧。autobook的中文版:http://blog.csdn.net/chaolumon/article/details/3763451,不过貌似还没翻译到libtool这章来。