在Visual Studio中,解决方案范围内的定义是什么?

7

我有一个使用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指向此版本而不是空的版本。 但是,我确定这是一个非常粗糙的解决方案,而且我不确定它是否有效。 有人能提出一种更优雅的方法来全局定义或创建变量,以便解决方案中的每个文件都可以看到它吗?

以防其他人也在寻找这个:https://dev59.com/eW435IYBdhLWcg3wtCSQ - Peter M
1个回答

2

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

g++ -DCOMPILE_FOR_LINUX .....

对于Windows系统,如果使用MSVS,您可以在项目属性中更改预处理器指令选项卡(实际上,您不需要这样做,因为COMPILE_FOR_LINUX未定义,但是您可以添加一个COMPILE_FOR_WINDOWS以保持一致性)。


这听起来很有前途。谢谢! - Alex Jansen
那不应该是-DCOMPILE_FOR_LINUX吗? - mort
@mort 我不知道,已经有一段时间没有使用gcc了。是吗? - Luchian Grigore
@mort 非常好。错误会指出你正在做一些错误的事情 - 即定义了两个文件。编译器错误是好的。 - Luchian Grigore
有用的编译器错误是好的。我想你可以在最开始检查定义,以便提供有用的错误信息并避免不愉快的意外。 - mort
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接