2

应该为 Windows、Linux 和嵌入式目标编译一个项目。应用程序在主机或嵌入式目标上运行时存在行为差异。总结一下我的要求,下表是:

   Target               Compiler      Behavior
   Windows              MSVC, gcc         A
   Host Linux           gcc               A
   Embedded Linux       cross pltf gcc    B

我希望创建一个可以自动识别编译器和环境差异的 Makefile(无需手动传递参数/定义)。是否可以通过仅在 C 源文件级别使用条件编译来解决此类问题?
到目前为止,我还没有使用 automake。

4

4 回答 4

6

自动工具就是为了解决这个问题。Makefile 本身不能做到这一点。

至于条件编译,这些编译器定义了几个可用的宏(例如_MSC_VER,用于 MSVC++、_WIN32Windows 和__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)

这应该足以满足您的目的。

于 2010-02-12T17:35:55.900 回答
2

我的回答是:可能。这取决于您的环境之间的差异。

我将为您的每个环境生成一个由 gcc 中的预处理器预定义的宏列表。您需要做的就是创建一个空文件,比如foo.h,然后运行以下命令:gcc -E -dM foo.h针对每个环境。我会将输出重定向到每个环境的不同文件。

然后,比较预定义的宏并寻找符合要求的宏。在您的问题中,您指出嵌入式环境具有与 Windows 和主机 Linux 平台不同的行为。假设您为嵌入式环境使用不同的芯片架构,则应该定义一个宏来指示该架构。例如,在我的 64 位 linux 机器上,__x86_64__是定义的。

获得该信息后,将该宏用作条件值:

#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif
于 2010-02-12T17:42:11.860 回答
0

gcc 将定义

 __linux__

在linux上编译时。MSVC 定义了类似的东西——我忘记了,但我相信文档会告诉你

但实际上你需要学习如何使用配置。这就是它的用途。学习起来很痛苦,但非常有用(automake、autoconf 等)

于 2010-02-12T17:33:45.417 回答
0

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

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

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

make.bat并通过包含的文件调用 make

@make.exe target=win32 %*
于 2010-02-12T18:02:31.977 回答