6

我有一个使用 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 指向这个版本而不是空的。但是,我确信这是一个非常粗略的解决方案,我不确定它是否会起作用。

任何人都可以提出一种更优雅的方法来全局定义某些东西或以解决方案中的每个文件都可以看到它的方式创建变量吗?

4

1 回答 1

2

这取决于您使用的编译器,但是gcc您可以从命令行指定预处理器指令,因此您只需要添加COMPILE_FOR_LINUX您的 makefile。

g++ -DCOMPILE_FOR_LINUX .....

对于windows,如果使用MSVS,你可以在项目属性中更改Preprocessor directives选项卡(实际上你不需要,因为COMPILE_FOR_LINUX没有定义,但你可以添加一个COMPILE_FOR_WINDOWS以保持一致性)。

于 2012-08-02T18:09:19.310 回答