Windows和 *NIX汇编检测
-
20-09-2019 - |
题
一个项目应用于Windows,Linux和一个嵌入式目标。在主机或嵌入式目标上运行时,该应用程序具有行为差异。总结我的要求,这是表:
Target Compiler Behavior
Windows MSVC, gcc A
Host Linux gcc A
Embedded Linux cross pltf gcc B
我希望创建一个可以自动识别编译器和环境差异的makefile(无需手动传递参数/定义)。是否可以通过在C源文件级别使用条件汇编来解决此类问题?
到目前为止,我不使用汽车。
解决方案
这 自动工具 被提出解决这个问题。 Makefile本身无法做到这一点。
至于条件编译,这些编译器可以定义几个宏(例如 _MSC_VER
对于MSVC ++, _WIN32
适用于Windows和 __linux__
对于Linux)。此外,GCC提供 处理不同CPU目标的断言.
Target Compiler Conditional
Windows MSVC++ #ifdef _MSC_VER
Windows gcc #if defined(_WIN32) && defined(__GNUC__)
Linux gcc #if defined(__linux__) && defined(__GNUC__)
Platform (x86) gcc #if #cpu(i386)
Platform (arm) gcc #if #cpu(arm)
对于您的目的,这应该足够。
其他提示
我的答案是:可能。这取决于您的环境之间的差异。
我将为您的每个环境生成由GCC中预处理器预定的宏的列表。您需要做的就是创建一个空文件,说 foo.h
, ,并运行以下命令: gcc -E -dM foo.h
对于每个环境。我将输出重定向到每个环境的其他文件。
然后,比较预定义的宏,并寻找适合账单的宏。在您的问题中,您指出嵌入式环境与Windows和主机Linux平台具有不同的行为。假设您在嵌入式环境中使用了不同的芯片体系结构,则应有一个指示体系结构的宏定义。例如,在我的64位Linux盒子上, __x86_64__
被定义为。
获得该信息后,将该宏用作您的条件价值:
#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif
海湾合作委员会将定义
__linux__
在Linux上编译时。 MSVC定义了类似的东西 - 我忘记了哪个,但我相信文档会告诉您
但是实际上,您需要学习如何使用配置。那就是它的目的。学习但非常有用的痛苦(Automake,AutoConf等)
不隶属于 StackOverflow