[英]Understanding Makefile rule
我一直在调试特定目标(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
条件是%.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
"@" 只是让当前行静音。
“-x”选项确定语言,因此$(gcc -x c++) $<
将文件(先决条件)编译为 C++ 文件。
- @$ 有什么用?
@$
不是一个单位。 @
是一个前缀,它禁止将命令的输出转发到make
的输出。 $
是变量引用( $(cpp_PRECOMPILE)
)的开头,它扩展为要运行的命令。
- $< 是保存先决条件名称的自动变量。 但总的来说,这个食谱试图做什么?
更具体地说, $<
扩展为第一个先决条件的名称。 这对您来说很重要,因为规则指定了多个先决条件。
配方中出现的变量名称非常清楚地表明配方应该做什么:
$(cpp_PRECOMPILE)
-- 某种准备编译的步骤。 那可能是什么,也可能什么都不是; 它大概取决于其他变量的值,也可能取决于其他因素。
$(cpp_COMMAND) $<
-- 编译第一个先决条件命名的源文件。 大概是用 C++ 编译器。
$(cpp_POSTCOMPILE)
-- 编译后要执行的某种后处理、清理或后续步骤。 与预编译步骤一样,这可以是任何东西,也可以什么都不是,细节取决于 makefile 的其他部分。
当没有给出 TARGET 时(默认为 linux)
make CPU=x86_64 DEBUG=no
完美地工作。
但是当 target=android 时,它失败了。
make CPU=x86_64 DEBUG=no TARGET=android
TARGET
(以及DEBUG
和CPU
)是特定于您的特定 makefile 的详细信息,而不是一般的make
功能。 我们无法谈论它们的具体影响。 但是,这些错误消息...
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
... 对当前的问题有一个相当清晰的描述:文件Test.cpp
,因为它正在被编译,试图#include
一个 C 头文件linux/ethtool.h
,该文件在支持的跨环境中找不到你的交叉构建。 当您执行不同类型的构建时,错误没有出现并不是特别相关。
您应该查看项目的构建需求文档。 它可能会指定特定的必需包,对于像您尝试执行的交叉构建,可能需要在交叉环境中安装这些包。 可能是内核头文件。 您可能还想寻求项目维护者的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.