为什么我的包含 header 的 makefile 不起作用?

Why doesn't my makefile with include header work?

我有以下生成文件(针对 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 中做错了什么吗?

谢谢

.cpp 来源构建 .o 目标的隐式 make 规则不使用 INCLUDE 变量。 INCLUDE 不是标准变量,默认使用 make 规则。您的 Makefile 依赖于默认的 make 规则,以便从 .cpp 来源构建 .o 目标。

指定预处理器选项的正确 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 中 linking foo 的显式 make 规则指定了所有这些 -I 选项。不幸的是,这绝对没有任何成就。 -I 仅在编译 .cpp 源代码时使用。 -I 选项在 linking 时根本不使用,在 linking 时被有效地忽略。您应该简单地从 link 命令中删除 $(INCLUDE),甚至不要将其替换为 $(CPPFLAGS)。它只会引起混乱。