首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换为libtool时,automake和autoconf找不到libtool

转换为libtool时,automake和autoconf找不到libtool
EN

Stack Overflow用户
提问于 2010-07-02 18:14:48
回答 3查看 5.7K关注 0票数 4

我正在尝试将libcsv转换为使用libtool,这样我就可以在mac os x上使用它,而不会损坏makefile。当我尝试运行从工具生成的makefile时,我得到以下错误:

代码语言:javascript
复制
~/software/libcsv (gnu_tools) $ make 
tag=CC   --mode=compile gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"
-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libcsv\" 
-DVERSION=\"3.0.1\" -I.     -g -O2 -MT libcsv.lo -MD -MP -MF .deps/libcsv.Tpo -c -o libcsv.lo  
libcsv.c
/bin/sh: --mode=compile: command not found
make: [libcsv.lo] Error 127 (ignored)
mv -f .deps/libcsv.Tpo .deps/libcsv.Plo
mv: rename .deps/libcsv.Tpo to .deps/libcsv.Plo: No such file or directory
make: *** [libcsv.lo] Error 1

我运行的是OSX10.5。因此,在搜索了一下之后,我注意到生成的makefile有一个空的libtool var:

代码语言:javascript
复制
<generated makefile>
LD = 
LDFLAGS = 
LIBOBJS = 
LIBS = 
LIBTOOL = 
LIPO = 
LN_S = 
LTLIBOBJS = 
<more generated makefile>

如果我将LIBTOOL设置为libtool,那么一切都很好。我假设我在autoconf或automake文件中犯了一个错误,如下所示:

代码语言:javascript
复制
Makefile.am
lib_LTLIBRARIES = libcsv.la
libcsv_la_SOURCES = libcsv.c
include_HEADERS = csv.h
libcsv_la_LDFLAGS = -version-info 3:1:0
ACLOCAL_AMFLAGS = -I m4

configure.ac
dn1 Process this file with autoconf to produce a configure script.
AC_INIT(libcsv.c)
AM_INIT_AUTOMAKE(libcsv, 3.0.1)
AC_PROG_CC
AC_OUTPUT(Makefile)
AC_PROG_LIBTOOL
AC_CONFIG_MACRO_DIR([m4])
AC_CHECK_FUNCS([strerror])
AC_FUNC_MALLOC
C_PROG_RANLIB
AC_PROG_CXX
LT_INIT
LT_OUTPUT
AC_TYPE_SIZE_T

如果这里有任何帮助,那就是config.log的一部分:

代码语言:javascript
复制
## ------------------ ##
## Running config.lt. ##
## ------------------ ##
config.lt:680: creating libtool
configure:17115: checking for size_t
configure:17115: gcc -c -g -O2  conftest.c >&5
configure:17115: $? = 0
configure:17115: gcc -c -g -O2  conftest.c >&5
conftest.c: In function 'main':
conftest.c:62: error: syntax error before ')' token
configure:17115: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| #define PACKAGE "libcsv"
| #define VERSION "3.0.1"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define HAVE_STRERROR 1
| #define HAVE_STDLIB_H 1
| #define HAVE_MALLOC 1
| /* end confdefs.h.  */
| #include <stdio.h>
| #ifdef HAVE_SYS_TYPES_H
| # include <sys/types.h>
| #endif
| #ifdef HAVE_SYS_STAT_H
| # include <sys/stat.h>
| #endif
| #ifdef STDC_HEADERS
| # include <stdlib.h>
| # include <stddef.h>
| #else
| # ifdef HAVE_STDLIB_H
| #  include <stdlib.h>
| # endif
| #endif
| #ifdef HAVE_STRING_H
| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
| #  include <memory.h>
| # endif
| # include <string.h>
| #endif
| #ifdef HAVE_STRINGS_H
| # include <strings.h>
| #endif
| #ifdef HAVE_INTTYPES_H
| # include <inttypes.h>
| #endif
| #ifdef HAVE_STDINT_H
| # include <stdint.h>
| #endif
| #ifdef HAVE_UNISTD_H
| # include <unistd.h>
| #endif
| int
| main ()
| {
| if (sizeof ((size_t)))
|       return 0;
|   ;
|   return 0;
| }
configure:17115: result: yes

有人知道我做错了什么吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-13 04:19:10

我没有给你一个明确的答案,但我建议的第一件事是把你的AC_OUTPUT放在你的configure.ac的末尾,在LT_INIT之后。这并不是完全如此简单,但将configure.ac的内容视为依次扩展为依次执行的shell脚本片段并没有太大的错误。如果您在找到libtool之前发出已配置的Makefile,那么这可以解释LIBTOOL为空的原因。

一个相当传统的configure.ac布局如下所示:

代码语言:javascript
复制
dnl Process this file with autoconf to produce a configure script.
AC_INIT(libcsv.c)
AM_INIT_AUTOMAKE(libcsv, 3.0.1)
AC_CONFIG_MACRO_DIR([m4])

dnl find programs
AC_PROG_CC
AC_PROG_CXX
LT_INIT
AC_PROG_RANLIB

dnl check functionality
AC_CHECK_FUNCS([strerror])
AC_FUNC_MALLOC
AC_TYPE_SIZE_T

AC_OUTPUT(Makefile)

我认为您不需要LT_OUTPUT,而且docs注意到AC_PROG_LIBTOOLLT_INIT的弃用同义词(因此同时拥有两者可能是自找麻烦)。

(没什么,请注意,OS有一个名为libtool的命令,它与GNU Libtool无关。我很确定这不是你的问题,但这是一个让人迷惑的问题)

票数 7
EN

Stack Overflow用户

发布于 2010-07-07 18:40:41

您可以尝试通过运行libtoolize --force来重新加强libtool集成(我在不同的主机上使用不同的libtool版本时遇到了很多问题,libtoolize --force在这种情况下很有帮助)。还要注意libtool消息的配置输出,它们必须像这样读取:

代码语言:javascript
复制
checking if libtool supports shared libraries... yes
configure: creating libtool
appending configuration tag "CXX" to libtool
appending configuration tag "F77" to libtool

特别是configure: creating libtool行必须出现在输出中。

票数 1
EN

Stack Overflow用户

发布于 2010-07-12 21:25:50

我的configure.ac只有:

代码语言:javascript
复制
LT_INIT([dlopen])
AC_SUBST([LIBTOOL_DEPS])

LT_OUTPUT用于在configure本身中使用libtool进行稍后的测试,并需要一个config.lt来进行设置。我从来没有用过它,所以我不知道所有需要的东西,但是去掉这一行并不会有什么坏处,看看它是否能解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3164810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档