当Make运行它时,为什么命令会失败但是当我运行它时会成功?

时间:2015-10-25 01:35:23

标签: makefile mingw msys2

我正在尝试构建C ++代码库。 (代码恰好是Cap'n Proto 0.5.3,但我也看到了其他项目。)我在MinGW-w64中使用GCC构建并在MSYS2中运行构建。 GCC是5.2.0。 Make是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" )


在此之后,我再次运行Make,它会更进一步,只是再次以相同的方式挂起。我复制并粘贴再次启动它。重复此循环,直到项目完全构建或出现实际错误。

我不认为这是libtool的问题;当我尝试使用相同的设置构建其他东西时,我已经看到了几个g ++命令的相同内容。也许这与Make或我的shell有什么不对?我不知道。

如何阻止这种情况发生?或者,如果失败了 - 有什么方法可以获得有关正在发生的事情的更多信息?令我感到困惑的是,当由Make运行时,相同的命令将失败,但在由我运行时会成功。

1 个答案:

答案 0 :(得分:0)

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

这个实例中的问题似乎是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

并解决了这个问题。我对此很满意,但更优雅的解决方案更可取。而且我希望我必须手动弄清楚如何使用这套工具来解决这个问题。 :(