了解 Makefile 规则

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 规则模式,我可以理解 那,

在这里,查看其他文件,我可以看到,

cpp_PRECOMPILE is :
cpp_COMMAND is gcc -x c++
cpp_PRECOMPILE is :

这就是食谱,有点像:

     @: 
     /opt/android-arm-r9/bin/arm-linux-androideabi- gcc -x c++ $< 
     @:

现在,我无法理解:

  1. @$有什么用?

  2. $<是自动变量持有前提名称。但总的来说,这个食谱试图做什么?

  3. 当没有给出TARGET时(默认为linux)

    make CPU=x86_64 DEBUG=no 
    

    完美运行。

    但是当TARGET=android时,它失败了。

    make CPU=x86_64 DEBUG=no TARGET=android
    

"@" 只会使当前行静音。

“-x”选项决定了语言,因此 $(gcc -x c++) $< 将文件(先决条件)编译为 C++ 文件。

  1. What is @$ for?

@$ 不是一个单位。 @ 是一个前缀,用于阻止将命令的输出转发到 make 的输出。 $ 是变量引用 ($(cpp_PRECOMPILE)) 的开头,它扩展为 运行.

的命令
  1. $< is automatic variable holding prerequisite name. But overall what action this recipe is trying to do?

更具体地说,$< 扩展为 first 先决条件的名称。这对您的情况很重要,因为该规则指定了多个先决条件。

配方中出现的变量名称非常清楚地表明配方应该做什么:

  1. $(cpp_PRECOMPILE) -- 某种准备编译的步骤。那可能是任何东西,也可能什么都不是;它可能取决于其他变量的值,也可能取决于其他因素。

  2. $(cpp_COMMAND) $< --编译第一个前提命名的源文件。大概是用 C++ 编译器。

  3. $(cpp_POSTCOMPILE) -- 编译后要执行的某种 post- 处理、清理或后续步骤。与预编译步骤一样,这可能是任何东西,也可能什么都不是,具体取决于 makefile 的其他部分。

  1. When no TARGET is given (default is linux)

    make CPU=x86_64 DEBUG=no
    

    works perfectly.

    But when target=android, it fails.

    make CPU=x86_64 DEBUG=no TARGET=android
    

TARGET(以及 DEBUGCPU)是特定于您的特定 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,在支持您的交叉构建的交叉环境中找不到哪个文件。当您执行不同类型的构建时错误不会出现并不是特别相关。

您应该查看项目的构建要求文档。它可能会指定特定的必需包,对于您尝试执行的交叉构建,可能需要在交叉环境中安装这些包。可能是内核头文件。您可能还想寻求项目维护者的帮助。