【问题标题】:Include only certain libraries on an operating system仅包括操作系统上的某些库
【发布时间】:2008-09-22 18:16:04
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你的问题其实是两个问题合二为一:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      一些选项包括:

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

      【讨论】:

        【解决方案3】:

        Macros上有一篇好文章。如何使用基于 OS/COmpiler 的条件编译的答案之一(靠近顶部)。

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

        【讨论】:

          【解决方案4】:

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

          ./configure
          make
          make install
          

          【讨论】:

            【解决方案5】:

            Scons 有一个配置机制,可以在不复杂的情况下完成许多 autotools 的工作,并且非常便携(尽管不如 autotools 便携)。

            【讨论】:

              【解决方案6】:

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

              我建议您查看一些较大的开源项目如何处理此问题。请参阅来自 Apache Xerces(旧版本)的 AutoSense.hpp

              【讨论】:

                【解决方案7】:

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

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

                【讨论】:

                  【解决方案8】:

                  也许这是一个逃避的答案,但你有没有看过 boost 是如何处理这个问题的?他们在很多没有自动配置的平台上构建,尽管他们确实有自己的构建系统 - bjam - 可能处理一些相同的情况。他们还在 windows 上做了一个很好的自动链接技巧,根据 MSVC 编译器的版本自动选择正确版本的库进行链接。根据您最初的描述,听起来只是检查各种平台/编译器的宏定义可能会奏效,但您的问题可能还有更多问题可以防止这种情况发生。

                  【讨论】:

                  • 他们使用预处理器和基于 MSVC pragma 的自动链接器来处理 Windows,IIRC 上的链接
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-11-22
                  • 2015-10-10
                  • 2012-09-11
                  • 2012-08-12
                  • 1970-01-01
                  • 2015-03-18
                  相关资源
                  最近更新 更多