为什么我的包含头文件的makefile不起作用?

时间:2016-10-18 01:24:08

标签: c++ makefile jvmti

我有以下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中我做错了吗?

由于

1 个答案:

答案 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)替换它。这只会造成混乱。