一个项目应用于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等)

您可以尝试使用预定义的宏的组合 操作系统体系结构;也许也很有趣: 编译器ID.

如果您不想使用更复杂的构建系统,则可以在makefile中解析命令行参数。一个简单的例子是增加 .exe 在Windows上可执行的名称。为此,我在makefile中有这样的代码

ifeq ($(target),win32)
    foo_binary := $(foo_binary).exe
endif

并通过 make.bat 包含文件

@make.exe target=win32 %*
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top