我使用Visual Studio 2008构建了一个非常大的应用程序,它可以在Windows XP上运行。该代码由一个包含六个独立项目的解决方案文件组成。我的工作是将此应用程序移植到Linux上运行。我之前没有做过这样的事情。
昨天我发现我的公司希望这个代码在我完成之后仍然可以在Windows上编译。我实现这一目标的第一个想法是使用预处理器语句,例如:
#define COMPILE_FOR_LINUX
然后,我可以使用预处理器块告诉编译器哪些文件包含在头文件中:
#ifdef COMPILE_FOR_LINUX
// include required Linux headers here and skip Windows header includes
#else
// include required Windows headers here and skip Linux header includes
#endif
在包含适当的文件之后,我可以使用以下块来封装所有与平台相关的代码:
#ifdef COMPILE_FOR_LINUX
// compile Linux specific code used here.
#else
// compile Windows specific code used here.
#endif
为了让某人能够轻松地为他们的首选平台编译应用程序,我想在一个地方指定COMPILE_FOR_LINUX。但是,我不知道如何做到这一点。
我的一个想法是创建一个空头文件,然后让解决方案中的每个文件都包含Visual Studio解决方案文件包含路径中指定的头文件。对于Linux,我有另一个版本的头文件定义COMPILE_FOR_LINUX,然后让makefile指向这个版本而不是空版本。但是,我确信这是一个非常粗糙的解决方案,我不确定它是否会起作用。
有人可以提出一种更优雅的方法来全局定义某些内容或创建一个变量,使解决方案中的每个文件都可以看到它吗?
答案 0 :(得分:2)
这取决于您正在使用的编译器,但对于gcc
,您可以从命令行指定预处理程序指令,因此您只需要在makefile中添加COMPILE_FOR_LINUX
。
g++ -DCOMPILE_FOR_LINUX .....
对于Windows,如果使用MSVS,您可以更改项目属性中的Preprocessor directives
选项卡(实际上,您不需要,因为COMPILE_FOR_LINUX
未定义,但您可以添加COMPILE_FOR_WINDOWS
为了保持一致性。)