Windows和* nix编译检测

时间:2010-02-12 17:29:01

标签: c windows linux makefile embedded-linux

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

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

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

4 个答案:

答案 0 :(得分:6)

autotools是为解决这个问题而做的。 Makefile本身不能这样做。

对于条件编译,这些编译器定义了几个可用的宏(例如,_MSC_VER表示MSVC ++,_WIN32表示Windows,而__linux__表示Linux。此外,gcc提供assertions for handling different CPU targets

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)

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

答案 1 :(得分:2)

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

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

然后,比较预定义的宏并寻找适合账单的宏。在您的问题中,您表明嵌入式环境与Windows和Host Linux平台具有不同的行为。假设您正在为嵌入式环境使用不同的芯片架构,则应该定义一个指示架构的宏。例如,在我的64位Linux机器上,定义了__x86_64__

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

#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif

答案 2 :(得分:0)

gcc将定义

 __linux__

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

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

答案 3 :(得分:0)

您可以尝试operating systemsarchitectures的预定义宏组合;也许也很有趣:compiler ids

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

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

并通过包含

make.bat文件调用make
@make.exe target=win32 %*