C Windows和*nix编译检测

C Windows和*nix编译检测,c,windows,linux,makefile,embedded-linux,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 我希

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

   Target               Compiler      Behavior
   Windows              MSVC, gcc         A
   Host Linux           gcc               A
   Embedded Linux       cross pltf gcc    B
我希望创建一个Makefile,自动识别编译器和环境差异(无需手动传递参数/定义)。仅在C源文件级别使用条件编译就可以解决此问题吗?
到目前为止,我还没有使用automake。

gcc将定义

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

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

我们为解决这个问题而设计的。Makefile本身无法做到这一点

至于条件编译,这些编译器定义了几个宏(例如,对于MSVC++,
\u MSC\u VER
,对于Windows和linux分别定义了
\u WIN32
)。此外,gcc还提供


就你的目的而言,这应该足够了。

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

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

然后,比较预定义的宏并寻找一个适合的宏。在您的问题中,您指出嵌入式环境具有与Windows和主机Linux平台不同的行为。假设您正在为嵌入式环境使用不同的芯片体系结构,那么应该定义一个宏来指示该体系结构。例如,在我的64位linux机器上,定义了
\uuuux86\u64\uuuu

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

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

您可以尝试为和组合预定义宏;也许也很有趣:

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

ifeq ($(target),win32)
    foo_binary := $(foo_binary).exe
endif
并通过包含

@make.exe target=win32 %*

实际上你不需要一个虚拟文件,你可以这样做:
$gcc-dM-E-
谢谢,@Paul。忘记了所有关于从标准输入读取的内容。当然,/dev/null在Windows上不起作用。自动工具可以解决这类问题,但对于某些项目来说,这可能会造成很大的开销。我同意Matt的观点。对于我拥有的这种类型(和规模)的项目,涉及自动工具是一项开销。你不必使用makefile。还有其他的选择。仅供参考:#cpu预处理器指令对于新的GCC版本来说是一个去润滑的指令。“echo | gcc-E-dM-”显示内置defines@Serge是否有一种确定目标体系结构的新方法?
@make.exe target=win32 %*