У меня есть следующий make-файл (для C ++)
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
Может кто-нибудь сказать мне, что я сделал не так в make-файле?
Спасибо
Неявный make
правило для строительства .o
цели из .cpp
источники не используют INCLUDE
переменная. INCLUDE
не является стандартной переменной, используемой по умолчанию make
правила. Ваш Makefile
зависит от правил make по умолчанию для построения .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)
, Это только вызывает путаницу.
Других решений пока нет …