应该为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 %*