仅包括操作系统上的某些库

时间:2008-09-22 18:16:05

标签: c++ c c-preprocessor conditional-compilation

在编写想要在mac,linux和windows上编译的应用程序时,管理需要包含在各种操作系统中的不同库的最佳方法是什么。例如,使用glut opengl工具包需要在每个操作系统上使用不同的包含。

8 个答案:

答案 0 :(得分:2)

你的问题实际上是两个问题:

1)如何编写我的C ++代码以在正确的平台上包含正确的包含文件?

2)如何编写Makefile以在不同平台上工作?

C ++代码问题已经得到解答 - 找到特定于平台的定义并使用它们来确定您所在的平台。

Automake或scons非常复杂,只有当您打算向广大受众发布代码时才值得花时间。对于内部代码,具有每个平台包含的“通用”makefile通常就足够了。对于Windows,您可以获取GNU Make for Windows(可从here获得),或使用nmake并将自己限制为所有平台之间通用语法的子集。

答案 1 :(得分:1)

如果您只需要担心头文件,那么预处理器将完成您需要的所有操作。如果你想处理不同的源文件,可能还有不同的库,你需要一个工具来处理它。

一些选项包括:

我个人最喜欢的是CMake。 Autotools使用了一个相对容易破解的多阶段过程,而且对我来说只是感觉很奇怪。除了makefile之外,Cmake还将为各种IDE生成项目文件。

答案 2 :(得分:1)

关于Macros的文章很好。其中一个答案是如何使用基于OS / COmpiler的条件编译(靠近顶部)。

使用自动配置工具是一个很好的补充,但对于可能更容易明确检测操作系统的小项目不需要,但对于可能需要在许多不同类型的操作系统上运行的大型项目您还应该探索Branan

提到的可用自动配置工具

答案 3 :(得分:0)

我参与过的几个项目都使用了一个基于autoconf的配置脚本来构建一个Makefile,因此你可以通过简单的方法从源代码构建所有这些:

./configure
make
make install

答案 4 :(得分:0)

Scons有一个配置机制,它可以完成很多autotools所做的工作而没有那么多的复杂性,并且相当便携(虽然不像autotools那样可移植)。

答案 5 :(得分:0)

编译器应该有一组可以使用的预处理器符号。例如,对于Linux系统上的gcc, linux ,对于VC ++,为_WIN32。如果您需要更复杂的东西,请查看autoconf,但这最适合基于Unix的代码。

我建议查看一些较大的OpenSource项目如何处理这个问题。请参阅Apache Xerces的旧版本中的AutoSense.hpp

答案 6 :(得分:0)

如果库在不同平台上提供相同的API,我将创建一个包含所有必需#ifdef的“代理”包含文件。然后,“平台无关”包含文件将包含在您的客户端代码中,而不是使用大量难看的预处理器命令来混淆它。这些将包含在丑陋且混乱的平台独立包含中。

如果API跨平台不同,则需要创建自己的抽象。

答案 7 :(得分:0)

也许这是一个警察的答案,但是你看过boost如何处理这个问题?它们构建在相当多的没有autoconf的平台上,尽管它们确实有自己的构建系统--bjam - 可能会处理一些相同的情况。他们还在Windows上执行一个很好的自动链接技巧,根据MSVC编译器的版本自动选择正确的库版本进行链接。根据你的初步描述,听起来只是宏检查各种平台/编译器可能会做的伎俩,但也许你的问题还有更多可以防止这种情况。