346

コンパイルの問題をデバッグしようとしていますが、GCC (または make??) が実行中の実際のコンパイラおよびリンカー コマンドを表示することができないようです。

これが私が見ている出力です:

  CCLD   libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1

私が見たいのはこれに似ているはずです:

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main

この例で完全なgccコマンドが表示されていることに注意してください。上記の例は、単に「CCLD libvirt_parthelper」のようなものを示しています。この動作を制御する方法がわかりません。

4

7 に答える 7

341

予行演習を呼び出すには:

make -n

これは、何makeをしようとしているのかを示します。

于 2011-04-28T14:40:03.733 に答える
201

autotools (./configure発行する必要がある) によって生成されるライブラリの makefile には詳細なオプションが含まれていることが多いため、基本的にmake VERBOSE=1orを使用make V=1すると完全なコマンドが得られるはずです。

ただし、これはメイクファイルの生成方法によって異なります。

この-dオプションは役立つかもしれませんが、出力が非常に長くなります。

于 2011-04-28T14:44:34.333 に答える
193

ビルドシステムに依存しない方法

make SHELL='sh -x'

別のオプションです。サンプルMakefile:

a:
    @echo a

出力:

+ echo a
a

これにより、 の特殊SHELL変数が設定され、展開された行を実行する前に印刷するように指示されmakeます-xsh

利点の 1 つ-nは、実際にコマンドを実行することです。一部のプロジェクト (Linux カーネルなど) では、-nおそらく依存関係の問題が原因で、通常よりもはるかに早く実行が停止する可能性があることがわかりました。

この方法の欠点の 1 つは、使用されるシェルが であることを確認する必要があることですsh。これは、Make が POSIX として使用するデフォルトのシェルですが、SHELLmake 変数で変更できます。

やるsh -vこともクールですが、Dash 0.5.7(Ubuntu 14.04 )はコマンドをsh無視するため(これが使用方法のようです)、何もしません。-cmake

make -pまた、設定された変数の値を出力することにも興味があります。

CMake で生成された Makefile は常にサポートしますVERBOSE=1

次のように:

mkdir build
cd build
cmake ..
make VERBOSE=1

専用の質問: Using CMake with GNU Make: How can I see the exact commands?

于 2015-08-14T13:12:26.770 に答える
31

GNU Make バージョン 4.0 以降、--trace引数は、makefile が何をなぜ行うのかを伝える良い方法であり、次のような行を出力します。

makefile:8: target 'foo.o' does not exist

また

makefile:12: update target 'foo' due to: bar
于 2016-05-21T21:45:06.367 に答える