在配置/编译时检查代码所依赖的功能是正确的方法。检查特定设备是有问题的,因为避免假阳性几乎是不可能的(即使不费吹灰之力也可能有人故意骗您),而此类检查的目的是回答以下问题:“我可以在这里构建吗?如果可以,应该使用什么代码路径我在用吗?” ,而不是“这是我喜欢这个名称的设备吗?”
根据此参考(通常,有关预定义宏的大量信息来源),您可以使用该宏:
__arm__
检测GCC /手臂组合。
我通过以下方法在我的网站上进行了检查:
#include <stdio.h>
int main() {
#ifdef __arm__
printf("Why yes it is, thank you\n");
#endif
return 0;
}
确实确实打印了消息。
请注意,这还将捕获所有 Arm设备,因此我的建议是也使用构建工具的一部分(例如cmake/autoconf
)来检查是否存在/opt/vc/include/bcm_host.h
。
例如与
AC_CHECK_HEADERS
在autoconf中:
AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)
原因:
HAVE__OPT_VC_INCLUDE_BCM_HOST_H
在config.h中定义
或对于CMake:
include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)
我认为没有更好的方法可以真正检测到这一点-您可以配置/ CMake查找硬件特定的东西,但是会有其他具有相同SoC的平台,所以即使这不是真的可靠,您真正关心的是什么该头文件的存在,因为它会告知您如何为给定目标进行构建。即使您可以证明它是Raspberry Pi,但找不到正确的头文件,仍然会卡住,而且早期出错比未完成编译要好。
如果您真的想检查它是否是Pi(或足够相似),可以采用以下简单方法:
grep -o BCM2708 /proc/cpuinfo
或(对于raspberrypi 2和3):
grep -o BCM2709 /proc/cpuinfo
在配置时,它将与Raspberry Pi所基于的SoC相匹配。
您可以进行更多测试(例如,USB将帮助您弄清楚它的位置,甚至暗示它是A型还是B型设备),但还不能肯定地说。
您可以对照已知列表检查/ boot中文件的哈希值,但是如果有固件更新或您不知道的非正式更新,则无法构建。(或其他具有相同启动设置的类似非Pi设备)
__ARMEL__
定义方式与您的完全一样__arm__
。我只是没有去寻找最好的宏。