我有以下makefile(对于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
有人可以告诉我在makefile中我做错了吗?
由于
答案 0 :(得分: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)
替换它。这只会造成混乱。