应为Windows,Linux和嵌入式目标编译一个项目。在主机或嵌入式目标上运行时,应用程序具有行为差异。总结一下我的要求,下面是表格:
Target Compiler Behavior
Windows MSVC, gcc A
Host Linux gcc A
Embedded Linux cross pltf gcc B
我希望创建一个自动识别编译器和环境差异的Makefile(无需手动传递参数/定义)。是否可以通过在C源文件级别使用条件编译来解决此类问题? 到目前为止我还没有使用automake。
答案 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 systems和architectures的预定义宏组合;也许也很有趣:compiler ids。
如果您不想使用更复杂的构建系统,则可以在makefile中解析命令行参数。一个简单的例子是在Windows上向可执行文件添加.exe
。为此,我在makefile中有这样的代码
ifeq ($(target),win32)
foo_binary := $(foo_binary).exe
endif
并通过包含
的make.bat
文件调用make
@make.exe target=win32 %*