【问题标题】:Why doesn't my makefile with include header work?为什么我的包含头文件的 makefile 不起作用?
【发布时间】:2016-10-18 01:24:08
【问题描述】:

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

谢谢

【问题讨论】:

  • 手动输入g++ ... 后输入的命令:pwd可以吗?
  • pwd 是当前目录(foo.cpp 所在的位置)。请不要在我的-I 中指定了一个绝对路径。因此,我在哪里称呼它并不重要
  • 是的,应该。手动传递 -I.. 这意味着父目录在搜索路径中
  • 哦,实际上...(即省略号)的意思是“等”;)
  • 哦,我明白了。所以,在你原来的makefile中,我猜你只是错误地声明了你的规则。我想应该是:foo.o : foo.cpp

标签: c++ makefile jvmti


【解决方案1】:

用于从.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 链接foo 的显式make 规则指定了所有这些-I 选项。不幸的是,这完全没有任何作用。 -I 仅在编译 .cpp 源时使用。 -I 选项在链接时根本不使用,并且在链接时被有效地忽略。你应该简单地从你的链接命令中删除$(INCLUDE),甚至不用用$(CPPFLAGS)替换它。它只会引起混乱。

【讨论】:

  • 哦,我明白了。作为一个 makefile 新手,我认为我可以“声明”任何变量(在这种情况下称为 INCLUDE)并引用它!
  • 你可以声明和引用任何你想要的变量。但是,如果您需要依赖默认规则,则仅声明默认规则实际使用的变量将完成任何有用的事情。此处使用的默认规则不使用INCLUDE。你可以声明它,并随心所欲地使用它,但默认规则不会使用它。
  • 嗯,如何让它使用它?
  • .o 定义你自己的构建.cpp 的规则,它可以使用任何你想要它使用的东西。就像你定义了从 foo.o 链接 foo 的规则一样。事实上,基于 make 的现有框架,例如 GNU automake,会生成自己的自定义构建规则,覆盖 make 的默认规则。
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多