2016-10-18 7 views
1

は私が期待どおりにfoo.oを生み出すだろう、なぜ私のメイクファイルがインクルードヘッダーで動作しないのですか?

LDLIBS=$(shell root-config --libs) 
INCLUDE= -I/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/include   \ 
     -I/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/include/darwin  \ 


foo: foo.o 
     $(CXX) -shared -fPIC $(LDLIBS) $(INCLUDE) -o foo.o foo.cpp 

foo.cppは私が手動で"g++ -shared -fPIC -I..."コマンドを実行すると、以下の

#include <jvmti.h> 

が含まれている(C++用)は、次のメイクファイルを持っています。

しかし、私はmakeを実行すると、私は

$ make                                 
c++ -c -o foo.o foo.cpp                         
lib_track_npe.cpp:1:10: fatal error: 'jvmti.h' file not found                     
#include <jvmti.h>                                
     ^                                 
1 error generated.                                
make: *** [foo.o] Error 1 

このエラーが発生します誰かが、私はメイクファイルで間違って何をしたかを教えていただけますか?

おかげ

+0

'g ++ ...'と入力した直後に 'pwd'コマンドを投稿できますか? – Amadeus

+0

pwdは現在のディレクトリ(foo.cpp)の場所です。私の '-I'では、絶対パスを指定してはいけません。したがって、それは私がそれをどこと呼んでも問題ではありません –

+0

はい、そうすべきです。手動であなたはパスします-I ..親ディレクトリが検索パスにあることを意味します – Amadeus

答えて

4

INCLUDE変数を使用していません.cpp源から.oターゲットを構築するための暗黙のルールmakeINCLUDEはデフォルトのmakeルールで使用される標準変数ではありません。 Makefileは、ソースから.oターゲットを構築するために、デフォルトのmakeルールに依存しています。

プリプロセッサオプションを指定するための正しいmake変数はCPPFLAGSです:

CPPFLAGS= -I/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/include   \ 
     -I/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/include/darwin  \ 

はさらに、foo.oからfooをリンクするためのあなたの明示的なmakeルールは、これらすべての-I optionalsを指定します。残念ながら、それはまったく何も達成しません。 -Iは、.cppソースをコンパイルする場合にのみ使用されます。 -Iオプションはリンク時にはまったく使用されず、リンク時には実質的に無視されます。 $(CPPFLAGS)に置き換えずに、リンクコマンドから$(INCLUDE)を削除するだけです。混乱の原因となるだけです。

+0

うわー、わかります。私は、makefileの初心者として、私が "INCLUDE"と呼ばれる変数を宣言し、それを参照できると考えました! –

+1

任意の変数を宣言して参照することができます。しかし、デフォルトのルールに依存する必要がある場合は、デフォルトのルールで実際に使用されている変数のみを宣言するだけで、何か役に立つものが得られます。ここで使われているデフォルトルールは 'INCLUDE'を使わない。宣言して使用することもできますが、デフォルトルールでは使用しません。 –

+0

ええと、どうすればそれを使用できるのですか? –

関連する問題