Windows和* nix编译检测

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

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

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

autotools是为了解决这个问题。 一个Makefile本身不能做到这一点。

至于条件编译,这些编译器定义了几个宏(例如MSVC ++的_MSC_VER ,Windows的_WIN32和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和Host Linux平台有不同的行为。 假设您为嵌入式环境使用不同的芯片架构,应该定义一个指示架构的宏。 例如,在我的64位Linux机器上,定义了__x86_64__

一旦你有了这个信息,使用这个宏作为你的条件值:

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

gcc将定义

  __linux__ 

当在Linux上编译。 MSVC定义了类似的东西 – 我忘记了,但我相信这些文档会告诉你

但是真的需要学习如何使用configure。 那是什么 这是一个学习的痛苦,但非常有用(automake,autoconf等)

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

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

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

并通过一个make.bat文件来调用make

 @make.exe target=win32 %*