web-dev-qa-db-ja.com

make / gccにコマンドを表示させるにはどうすればいいですか?

私はコンパイルの問題をデバッグしようとしていますが、それが実行している実際のコンパイラとリンカコマンドを表示するためにGCC(またはmake 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"のようなものを示しています。この動作を制御する方法がわかりません。

218
hernejj

ドライランを起動するには

make -n

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

224
chrisaycock

Autotools(あなたが発行しなければならない./configure)によって生成されるライブラリmakefileはしばしば冗長なオプションを持っています、それで、基本的に、make VERBOSE=1またはmake V=1を使うことはあなたに完全なコマンドを与えるべきです。

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

-dオプションは役立つかもしれませんが、非常に長い出力を与えるでしょう。

147
Gui13

システムに依存しない方法を構築する

make Shell='sh -x'

別の選択肢です。サンプルMakefile

a:
    @echo a

出力:

+ echo a
a

これはShellに特殊なmake変数を設定し、-xは実行する前に展開された行を表示するようにshに指示します。

-nに対する1つの利点は、実際にコマンドを実行することです。私は、いくつかのプロジェクト(例えばLinuxカーネル)では-nがおそらく依存関係の問題のために通常よりはるかに早く実行を停止するかもしれないことを発見しました。

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

sh -vを実行することも同様にクールですが、Dash 0.5.7(Ubuntu 14.04 sh)は-cコマンドを無視するので(makeがそれを使用する方法のようです)、何もしません。

make -pもあなたの興味を引くでしょう。それは集合変数の値を出力します。

CMakeはMakefileを生成しました

make VERBOSE=1

参照: GNU MakeでCMakeを使う:正確なコマンドはどうやって見ることができますか?

GNU Make version 4.0以降、--trace引数はmakefileが何をそして何故するのかを知るための良い方法です。

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

または

makefile:12: update target 'foo' due to: bar
17
Julien Palard

make V=1を使う

ここで他の提案:

  • make VERBOSE=1 - 少なくとも私の試験ではうまくいきませんでした。
  • make -n - 実行中のコマンドラインではなく、論理演算のみを表示します。例えば。 CC source.cpp

  • make --debug=j - 同様に動作しますが、マルチスレッド構築を有効にして余分な出力を引き起こす可能性があります。

12
TarmoPikaro

あなたのautomakeのバージョンによっては、これを使うこともできます。

make AM_DEFAULT_VERBOSITY=1

参照: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html

注:V=1が機能しないため、この回答を追加しました。

4
Ru Hasha

私は使うのが好きです。

make --debug=j

実行するコマンドを示しています。

https://linux.die.net/man/1/make

--debug [= FLAGS]通常の処理に加えてデバッグ情報を表示します。 FLAGSが省略されている場合、動作は-dが指定されている場合と同じです。 FLAGSはすべてのデバッグ出力(-dの使用と同じ)、bは基本デバッグ、vはより詳細な基本デバッグ、iは暗黙のルールを示す、jはコマンド呼び出しの詳細、およびmakefileを作り直す間のデバッグのためのm。