对于C库,由于内存问题,我需要检查当前的编译器是否适用于x86_64.我发现的命令完全符合我的要求:
CXXARCH:=$(${CXX} -dumpmachine | grep -i 'x86_64')
其中${CXX}是gcc或clang.对于x86_64机器,这将返回一个非空字符串.对于RaspBerry Pi这样的32位计算机,该字段将为空.
如何区分这两种情况?
我这样做:
ifneq (${CXXARCH},)
MAGICVAR:=-DMY_DEFINE
endif
使用$(info)打印,我确保在RaspBerry Pi中不满足此条件,应该这样做,因为命令clang-6.0 -dumpmachine返回:armv7l-unkNown-linux-gnueabihf.那么为什么不执行此条件呢?我究竟做错了什么?
解决方法:
语法
$(${CXX} -dumpmachine | grep -i 'x86_64')
是Shell语法.它无法满足您在Makefile中的要求.要在Makefile中扩展CXX变量,首选语法是使用$(CXX)(虽然${CXX}也可以,但是$CXX不能).要捕获shell输出,您需要使用$(shell命令).从而
CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64')
ifneq ($(CXXARCH),)
MAGICVAR:=-DMY_DEFINE
endif
请注意,编译器目标与结果程序中的“内存问题”无关.您可以使用x86_64-linux-gnu-gcc编译32位程序(-m32),并获得与32位编译器相同的“相同内存问题”.
最后,确保您没有混淆ifneq和ifeq.
ifneq ($(CXXARCH),)
表示“如果$(CXXARCH)不扩展为空字符串,则…”