了解 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 规则模式,我可以理解
那,
目标是 $(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
"@" 只会使当前行静音。
“-x”选项决定了语言,因此 $(gcc -x c++) $<
将文件(先决条件)编译为 C++ 文件。
- What is @$ for?
@$
不是一个单位。 @
是一个前缀,用于阻止将命令的输出转发到 make
的输出。 $
是变量引用 ($(cpp_PRECOMPILE)
) 的开头,它扩展为 运行.
的命令
- $< is automatic variable holding prerequisite name. But overall what action this recipe is trying to do?
更具体地说,$<
扩展为 first 先决条件的名称。这对您的情况很重要,因为该规则指定了多个先决条件。
配方中出现的变量名称非常清楚地表明配方应该做什么:
$(cpp_PRECOMPILE)
-- 某种准备编译的步骤。那可能是任何东西,也可能什么都不是;它可能取决于其他变量的值,也可能取决于其他因素。
$(cpp_COMMAND) $<
--编译第一个前提命名的源文件。大概是用 C++ 编译器。
$(cpp_POSTCOMPILE)
-- 编译后要执行的某种 post- 处理、清理或后续步骤。与预编译步骤一样,这可能是任何东西,也可能什么都不是,具体取决于 makefile 的其他部分。
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
(以及 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
,在支持您的交叉构建的交叉环境中找不到哪个文件。当您执行不同类型的构建时错误不会出现并不是特别相关。
您应该查看项目的构建要求文档。它可能会指定特定的必需包,对于您尝试执行的交叉构建,可能需要在交叉环境中安装这些包。可能是内核头文件。您可能还想寻求项目维护者的帮助。
我一直在调试特定目标 (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
"@" 只会使当前行静音。
“-x”选项决定了语言,因此 $(gcc -x c++) $<
将文件(先决条件)编译为 C++ 文件。
- What is @$ for?
@$
不是一个单位。 @
是一个前缀,用于阻止将命令的输出转发到 make
的输出。 $
是变量引用 ($(cpp_PRECOMPILE)
) 的开头,它扩展为 运行.
- $< is automatic variable holding prerequisite name. But overall what action this recipe is trying to do?
更具体地说,$<
扩展为 first 先决条件的名称。这对您的情况很重要,因为该规则指定了多个先决条件。
配方中出现的变量名称非常清楚地表明配方应该做什么:
$(cpp_PRECOMPILE)
-- 某种准备编译的步骤。那可能是任何东西,也可能什么都不是;它可能取决于其他变量的值,也可能取决于其他因素。$(cpp_COMMAND) $<
--编译第一个前提命名的源文件。大概是用 C++ 编译器。$(cpp_POSTCOMPILE)
-- 编译后要执行的某种 post- 处理、清理或后续步骤。与预编译步骤一样,这可能是任何东西,也可能什么都不是,具体取决于 makefile 的其他部分。
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
(以及 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
,在支持您的交叉构建的交叉环境中找不到哪个文件。当您执行不同类型的构建时错误不会出现并不是特别相关。
您应该查看项目的构建要求文档。它可能会指定特定的必需包,对于您尝试执行的交叉构建,可能需要在交叉环境中安装这些包。可能是内核头文件。您可能还想寻求项目维护者的帮助。