【发布时间】:2021-11-12 15:26:04
【问题描述】:
我一直在调试特定目标(android)的链接错误,对于所有其他目标,构建成功。
错误类似于
Test.cpp:29:57: fatal error: linux/ethtool.h: No such file or directory compilation terminated.
make: *** [../../../makefiles/rules.makefile:1012: android-arm-r/Test.o] Error 1
构建命令是:
make DEBUG=no TARGET=android
我检查了这个 rules.makefile 的 1012 行:
$(OBJDIR)/%.$(OBJ_SUFFIX): %.cpp $(OBJDIR)/%.d
@$(cpp_PRECOMPILE)
$(cpp_COMMAND) $<
@$(cpp_POSTCOMPILE)
现在,作为典型的 make 规则模式,我可以理解 那个,
-
目标是
$(OBJDIR)/%.$(OBJ_SUFFIX) -
先决条件是
%.cpp $(OBJDIR)/%.d(源文件,主要是Test.cpp,是该目录中唯一的cpp文件) -
食谱是
@$(cpp_PRECOMPILE) $(cpp_COMMAND) $< @$(cpp_POSTCOMPILE)
这里,查看其他文件,我可以看到,
cpp_PRECOMPILE is :
cpp_COMMAND is gcc -x c++
cpp_PRECOMPILE is :
所以配方有点像:
@:
/opt/android-arm-r9/bin/arm-linux-androideabi- gcc -x c++ $<
@:
现在,我无法理解:
-
@$是干什么用的? -
$<是自动变量保存先决条件名称。但总的来说,这个配方试图做什么? -
当没有给出
TARGET时(默认是linux)make CPU=x86_64 DEBUG=no完美运行。
但是当
TARGET=android时,它失败了。make CPU=x86_64 DEBUG=no TARGET=android
【问题讨论】:
-
$(cpp_COMMAND)的扩展不是$(gcc -x c++)。只是gcc -x c++。$(cpp_PRECOMPILE)的扩展不是$(:)它只是:。$(...)是变量引用的一部分,在扩展过程中与变量名一起被替换。 -
如果
cpp_COMMAND变量的值真的只是gcc -x c++,那么对于这个目标来说,这真的是错误的。它应该有更多的内容。但是您没有向我们展示它是如何设置或修改的,所以我们无话可说,除非它是错误的。 -
@MadScientist 你是对的!!实际命令是“$(TOOLSPATH) gcc -x C++”,其中 TOOLSPATH = /opt/android-arm-r9/bin/arm-linux-androideabi-
-
@MadScientist 我已经用 MadScientist 提供的更多信息和一些澄清更新了这个问题。
-
我很确定您在
$(TOOLSPATH)和gcc之间添加的额外空间实际上并不存在于您的makefile 中。不过,这不是我的意思。这里应该有很多额外的标志,而不仅仅是-x。应该有至少一个-c选项,以及几乎可以肯定的各种-I和其他选项。您为什么不直接查看 make 实际调用的命令行,它会在您在上面显示的错误之前为您打印出来,并告诉我们它说了什么?