0

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


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

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

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

4

1 回答 1

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 下工作的机器对它不好。作为 hack,我将 LIBTOOL 行更改为:

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

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

于 2015-10-27T05:38:42.220 回答