为什么命令在 Make 运行s 时失败,但在我 运行 时成功?

Why would a command fail when Make runs it but succeed when I run it?

我正在尝试构建 C++ 代码库。 (代码恰好是 Cap'n Proto 0.5.3,但我在其他项目中也看到了这一点。)我在 MinGW-w64 中使用 GCC 进行构建,运行 在 MSYS2 中构建。海湾合作委员会是 5.2.0。使是 4.1.

我运行make,顺带一会。然后它停止了,因为它试图 运行 的某些命令因错误而失败。好,可以。这个错误让我很困惑。我将命令从 Make 的输出复制并粘贴到终端,然后尝试手动 运行 它,没有任何更改。我预计它会以同样的方式再次失败,因此我可能会修补它以探索问题......但它成功了! (好吧,我对 libtool 一无所知...它会生成指定的输出文件!)

上述操作的说明:

MSYS /c/programmingstuff/capnproto-c++-0.5.3
$ make capnp.exe
C:/msys64/usr/bin/sh.exe ./libtool  --tag=CXX   --mode=link g++ -std=gnu++11 -I./src -I./src -DKJ_HEADER_WARNINGS -DCAPNP_HEADER_WARNINGS -DCAPNP_INCLUDE_DIR='"/usr/local/include"' -mthreads -static-libgcc -static-libstdc++ -mthreads -release 0.5.3 -no-undefined  -o libkj.la -rpath /usr/local/lib src/kj/common.lo src/kj/units.lo src/kj/memory.lo src/kj/refcount.lo src/kj/array.lo src/kj/string.lo src/kj/string-tree.lo src/kj/exception.lo src/kj/debug.lo src/kj/arena.lo src/kj/io.lo src/kj/mutex.lo src/kj/thread.lo src/kj/main.lo src/kj/parse/char.lo
libtool: link: you must specify an output file
libtool: link: Try `libtool --help --mode=link' for more information.
makefile:1405: recipe for target 'libkj.la' failed
make: *** [libkj.la] Error 1

MSYS /c/programmingstuff/capnproto-c++-0.5.3
$ C:/msys64/usr/bin/sh.exe ./libtool  --tag=CXX   --mode=link g++ -std=gnu++11 -I./src -I./src -DKJ_HEADER_WARNINGS -DCAPNP_HEADER_WARNINGS -DCAPNP_INCLUDE_DIR='"/usr/local/include"' -mthreads -static-libgcc -static-libstdc++ -mthreads -release 0.5.3 -no-undefined  -o libkj.la -rpath /usr/local/lib src/kj/common.lo src/kj/units.lo src/kj/memory.lo src/kj/refcount.lo src/kj/array.lo src/kj/string.lo src/kj/string-tree.lo src/kj/exception.lo src/kj/debug.lo src/kj/arena.lo src/kj/io.lo src/kj/mutex.lo src/kj/thread.lo src/kj/main.lo src/kj/parse/char.lo
libtool: link: ar cru .libs/libkj.a  src/kj/common.o src/kj/units.o src/kj/memory.o src/kj/refcount.o src/kj/array.o src/kj/string.o src/kj/string-tree.o src/kj/exception.o src/kj/debug.o src/kj/arena.o src/kj/io.o src/kj/mutex.o src/kj/thread.o src/kj/main.o src/kj/parse/char.o
libtool: link: ranlib .libs/libkj.a
libtool: link: ( cd ".libs" && rm -f "libkj.la" && cp -pR "../libkj.la" "libkj.la" )


在此之后,我 运行 再次制作,它变得更远,只是再次以同样的方式挂起。我复制并粘贴以再次启动它。重复此循环,直到项目完全构建或出现 real 错误。

我认为这不是 libtool 的问题;当我试图用相同的设置构建其他东西时,我已经用几个 g++ 命令看到了同样的事情。也许是 Make 或我的 shell 有问题?我不知道。

我怎样才能阻止这种情况发生?或者,失败了——什么是获得有关正在发生的事情的进一步信息的好方法?令我困惑的是,当 Make 运行 时,相同的命令会失败,但当我 运行 时,相同的命令会成功。

现在我有一个愚蠢的 hacky 答案似乎已经解决了至少一个问题实例,所以我会 post 在这里。无论如何,这比手动复制和粘贴每个失败的命令要好得多。

本例中的问题似乎是 Windows-UNIX 文件路径差异,我的一些 UNIXy 工具希望路径以 /c/(或只是 /)开头,而其他工具则很酷以 C:/ 开头的路径。我不知道具体是哪些工具。我只知道这个 Makefile 包含这些行:

LIBTOOL = $(SHELL) $(top_builddir)/libtool

...

SHELL = /bin/sh

这使得 $(LIBTOOL) 扩展到

C:/msys64/usr/bin/sh.exe ./libtool

无论出于何种原因。显然,我尝试手动重新运行命令(通过将其粘贴到终端中)所涉及的程序在 C:/ 下运行良好,但至少有一个在 Make 下工作的机器无法正常运行。作为黑客,我将 LIBTOOL 行更改为:

LIBTOOL = /bin/sh $(top_builddir)/libtool

这解决了问题。我对此基本没意见,尽管更优雅的解决方案会更可取。而且我希望在其他任何时候使用这套工具发生这种情况时,我都必须手动弄清楚如何做这样的事情。 :(