对于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
。那么为什么不执行此条件呢?我在做什么错了?
答案 0 :(得分:4)
语法
{ quiz: {answer: 5 }}
是 shell 语法。它无法完成$(${CXX} -dumpmachine | grep -i 'x86_64')
中您想要的操作。要在 Makefile 中扩展CXX变量,首选语法是使用Makefile
(虽然$(CXX)
也可以,但是 ${CXX}
不能)。要捕获shell输出,您需要使用$CXX
。因此
$(shell command)
请注意,编译器目标与结果程序中的“内存问题”无关。您可以使用CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64')
ifneq ($(CXXARCH),)
MAGICVAR:=-DMY_DEFINE
endif
来编译32位程序(-m32)并获得与32位编译器相同的“相同的内存问题”。
最后确保您没有混淆x86_64-linux-gnu-gcc
和ifneq
。
ifeq
表示“如果ifneq ($(CXXARCH),)
不能 扩展为空字符串,则...”
答案 1 :(得分:0)
假设使用POSIX系统,则将结果通过def findSubstringsRecursive(string, substring):
counter = 0
substringLength = len(substring)
for i in range(len(string)):
if string[i] == substring[0]:
end = i + substringLength
sub1 = string[i:end]
if substring == sub1:
return 1 + findSubstringsRecursive(string[i+1:], substring)
return 0
传递给管道:
wc -l
如果结果为零,则其中包含CXXARCH:=$(shell $(CXX) -dumpmachine | grep -i 'x86_64' | wc -l)
的零行。在makefile中比字符串值更容易处理。
(包括获取shell语法的修补程序)