2016-10-18 3 views
1

У меня есть следующие Makefile (для с ++)Почему мой makefile с включенным заголовком не работает?

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 имеет следующие включает

#include <jvmti.h> 

Если я запускаю команду "g++ -shared -fPIC -I..." вручную, он будет производить foo.o, как и ожидалось.

Но когда я бегу 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 

Может кто-то пожалуйста, скажите мне, что я сделал неправильно в Makefile?

Благодаря

+0

Вы можете отправить команду: 'pwd', когда вы вводите ее сразу после ввода' g ++ ... 'вручную? – Amadeus

+0

pwd - текущий каталог (где foo.cpp). Пожалуйста, не то, что в моем '-I' я указал абсолютный путь. Следовательно, не имеет значения, где я называю это –

+0

Да, это должно быть. Вручную вы передаете -I .. это означает, что родительский каталог находится в пути поиска – Amadeus

ответ

4

неявной make правило для построения .o целей из .cpp источников не использует переменную INCLUDE. INCLUDE не является стандартной переменной, используемой по умолчанию правилами make. Ваш Makefile зависит от правил по умолчанию, чтобы построить .o целей из .cpp источников.

Правильная 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  \ 

Кроме того, ваше явное make правила для связывания foo из foo.o определяет все эти -I УСТРОЙСТВА. К сожалению, это абсолютно ничего не делает. -I используется только при компиляции .cpp источников. Опция -I не используется вообще при связывании и эффективно игнорируется при связывании. Вы должны просто удалить команду $(INCLUDE) из своей ссылки, даже не заменив ее $(CPPFLAGS). Это только вызывает путаницу.

+0

Ооо, я вижу. Я, как начинающий makefile, думал, что могу «объявить» любую переменную (которая в этом случае называется INCLUDE) и ссылаться на нее! –

+1

Вы можете объявить и указать любую переменную, которую хотите. Но если вам нужно полагаться на правила по умолчанию, объявление только переменных, которые фактически используются правилами по умолчанию, будет выполнять что-нибудь полезное. Используемое здесь правило по умолчанию не использует 'INCLUDE'. Вы можете объявить об этом и использовать его, как хотите, но правило по умолчанию не будет использовать его. –

+0

Хм, так как я могу использовать его? –