私はコンパイルの問題をデバッグしようとしていますが、それが実行している実際のコンパイラとリンカコマンドを表示するために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"のようなものを示しています。この動作を制御する方法がわかりません。
ドライランを起動するには:
make -n
これはmake
が何をしようとしているのかを示します。
Autotools(あなたが発行しなければならない./configure
)によって生成されるライブラリmakefileはしばしば冗長なオプションを持っています、それで、基本的に、make VERBOSE=1
またはmake V=1
を使うことはあなたに完全なコマンドを与えるべきです。
しかし、これはメイクファイルの生成方法によって異なります。
-d
オプションは役立つかもしれませんが、非常に長い出力を与えるでしょう。
システムに依存しない方法を構築する
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 version 4.0以降、--trace
引数はmakefileが何をそして何故するのかを知るための良い方法です。
makefile:8: target 'foo.o' does not exist
または
makefile:12: update target 'foo' due to: bar
make V=1
を使う
ここで他の提案:
make VERBOSE=1
- 少なくとも私の試験ではうまくいきませんでした。make -n
- 実行中のコマンドラインではなく、論理演算のみを表示します。例えば。 CC source.cpp
make --debug=j
- 同様に動作しますが、マルチスレッド構築を有効にして余分な出力を引き起こす可能性があります。
あなたのautomakeのバージョンによっては、これを使うこともできます。
make AM_DEFAULT_VERBOSITY=1
参照: https://lists.gnu.org/archive/html/bug-autoconf/2012-01/msg00007.html
注:V=1
が機能しないため、この回答を追加しました。
私は使うのが好きです。
make --debug=j
実行するコマンドを示しています。
https://linux.die.net/man/1/make
--debug [= FLAGS]通常の処理に加えてデバッグ情報を表示します。 FLAGSが省略されている場合、動作は-dが指定されている場合と同じです。 FLAGSはすべてのデバッグ出力(-dの使用と同じ)、bは基本デバッグ、vはより詳細な基本デバッグ、iは暗黙のルールを示す、jはコマンド呼び出しの詳細、およびmakefileを作り直す間のデバッグのためのm。