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または私のシェルに何か問題があるのでしょうか?知らない。

どうすればこれを防ぐことができますか? または、それが失敗した場合、何が起こっているかについてさらに情報を得るにはどうすればよいでしょうか? 同じコマンドを Make で実行すると失敗するが、私が実行すると成功することに困惑しています。

4

1 に答える 1

0

今、私は問題の少なくとも 1 つのインスタンスを解決したように見えるばかげたハッキーな答えを持っているので、ここに投稿します。とにかく、失敗したすべてのコマンドを手動でコピーして貼り付けるよりもはるかに優れています。

この場合の問題は、Windows と UNIX のファイル パスの不一致にあるようです。私の UNIX ツールの中には、/c/ (または単に /) で始まるパスを必要とするものもあれば、C:/ で始まるパスを使用するものもありました。これらが特にどのツールであったかはわかりません。この Makefile に次の行が含まれていることだけはわかっています。

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

...

SHELL = /bin/sh

$(LIBTOOL) を展開したまま

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

理由はともかく。コマンドを手動で (端末に貼り付けて) 再実行しようとしたプログラムは、C:/ ではうまくいったようですが、Make の下で動作する機械の少なくとも 1 つの部分は問題ありませんでした。ハックとして、LIBTOOL行を次のように変更しました。

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

そしてそれは問題を修正しました。私はそれでほとんど問題ありませんが、よりエレガントなソリューションが望ましいでしょう。そして、この一連のツールでこれが発生した場合は、このようなことを行う方法を手動で把握する必要があると思います。:(

于 2015-10-27T05:38:42.220 に答える