2016-10-18 2 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 목표를 구축하기위한 암시 적 make 규칙입니다. INCLUDE은 기본적으로 make 규칙에 사용되는 표준 변수가 아닙니다. Makefile.cpp 개 출처의 .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 선택적 항목을 지정합니다. 불행히도, 그것은 절대적으로 아무것도 수행하지 않습니다. -I.cpp 소스를 컴파일 할 때만 사용됩니다. -I 옵션은 링크 할 때 전혀 사용되지 않으며 링크시 효과적으로 무시됩니다. $(CPPFLAGS)으로 바꾸지 않고 링크 명령에서 $(INCLUDE)을 제거하기 만하면됩니다. 그것은 혼란을 일으킬뿐입니다.

+0

우우. 필자는 makefile 초보자로서, 어떤 변수 (이 경우 INCLUDE라고 함)를 "선언"하여 참조 할 수 있다고 생각했습니다! –

+1

원하는 변수를 선언하고 참조 할 수 있습니다. 그러나 기본 규칙에 의존해야하는 경우 기본 규칙에서 실제로 사용되는 변수 만 선언하면 유용 할 수 있습니다. 여기에 사용 된 기본 규칙은'INCLUDE'을 사용하지 않습니다. 선언하고 원하는대로 사용할 수 있지만 기본 규칙에서는 사용하지 않습니다. –

+0

흠, 그럼 어떻게 사용합니까? –

관련 문제