自动化构建错误 './ltmain.sh' 未找到。

35

我使用 mingw-get-setup.exe 安装了 mingw 和 msys。我还将 Autotools(autoconf,automake,m4,libtool)安装到了 C:\/opt/autotools

当我运行 automake 时,总是出现以下错误:

configure.ac:11: error: required file './ltmain.sh' not found

如果我从libtool的安装目录中复制ltmain.sh,执行将正常完成。

如何配置automake以在不复制的情况下找到ltmain.sh?


你需要调整你的路径或者指定ltmain.sh的完整路径。 - Chris Maes
ltmain.sh 位于 c:\opt\autotools\share\libtool\config。而 PATH=/c/opt/autotools/bin:/C/opt/autotools/share/libtool/config:.:/usr/local/bin - user1345414
2个回答

70

在一个 autoconf/automake/libtool 项目中,你需要运行:

  • libtoolize:这将复制/链接一些支持脚本,包括 ltmain.sh(这是 libtool 的主要组成部分)。
  • aclocal:这会查找所有 configure 脚本所需的 m4 宏,并创建一个本地副本以便更轻松地访问。
  • autoheader:可选的,如果你想使用 config.h/AC_CONFIG_HEADERS,否则所有测试结果宏将在调用编译器时内联。
  • autoconf:将 configure.ac 中使用的所有宏展开到 configure 脚本中。
  • automake:将所有的 Makefile.am 转换成 Makefile.in 模板。你可能想使用 --add-missing 来调用此命令,以便额外的支持脚本可以被链接/复制到你的项目中(例如 compilemissingdepcomptest-driver 等)。

不必担心运行每个工具。只需 调用 autoreconf -i,它将运行所需的工具。如果想查看正在执行的工具,请添加 -v 标志。为了避免错误,在你的项目根目录中加入这样一个脚本:

#!/bin/bash -x
mkdir -p m4
exec autoreconf --install "$@"

从源代码库直接检出/克隆项目的用户需要至少运行一次此脚本./bootstrap。如果用户获取了tarball分发包,则不需要。

Automake可以很好地照顾自己,它将在需要时重新调用上述工具,当你运行make时。但是,如果您生成了损坏的Makefile,则需要再次调用./bootstrap./configure以生成新的Makefile


4
非常有帮助,非常感谢。我只需要运行“sudo libtoolize && sudo aclocal && sudo autoheader && sudo autoconf && sudo automake --add-missing”即可。 - Mitermayer Reis
1
@MitermayerReis 如果你需要使用 sudo,那么你没有该目录和/或文件的写入权限。这些文件是否属于另一个用户? - DanielKO
@Mitermayer,我认为你应该将你的评论添加为解决方案。谢谢! - ransh
4
“sudo” 不应被滥用,原因与您不应始终以 root 用户身份登录 *nix 系统相同。编译软件不是管理任务,不应需要升级的权限。 - DanielKO
@FrankPuck 你是如何打包你的软件以便分发的呢?它是否遵循了变量或环境特征应该影响其构建或安装的约定?在构建时,你是否跟踪依赖项?测试是否是构建和分发过程的一部分?因为所有这些事情都需要大量的工作量才能用原始的Makefile完成,更不用说做到正确了。 - DanielKO
显示剩余4条评论

0

正如DanielKO所说,ltmain.sh是由libtoolize创建的。

但是,如果没有呢?

需要满足以下要求:

  1. configure.ac必须存在,并且至少包含以下之一: AM_PROG_LIBTOOL、AC_PROG_LIBTOOL、LT_INIT (请参见/usr/bin/libtoolize中的func_require_seen_libtool函数)

  2. 如果configure.ac不包含AC_CONFIG_AUX_DIR,则libtoolize将在...../..中查找名为'install-sh'或'install.sh'的文件,如果找到,则将其用作“auxdir”并在那里安装ltmain.sh(请参见libtoolize内部的func_require_aux_dir函数)。

在我的情况下,我正在另一个项目的子目录中工作,而示例项目的configure.ac中没有AC_CONFIG_AUX_DIR;因此,libtoolize找到了父项目的根目录,并在那里安装了ltmain.sh,而不是在示例项目的根目录中安装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接