我对 C++ 比较陌生(以前有 Python 经验并涉足 Java),我正在编写一个小程序作为熟悉项目。作为程序的一部分,我正在编写一个类来解码一些数据,最终将编写一个类似的类来执行编码。代码是我确信我会经常重用的东西,并认为创建一个库作为项目的一部分会很有趣。
我的问题是,什么被认为是创建库的最佳实践?

编辑:(修订)

问了这个问题后,我意识到我不知道我不知道什么。我做了更多的研究,这应该有助于使我的问题更具体:

  • 我正在 Qt Creator 中开发。因此,与 Qt 相关的细节会有所帮助,但不是必需的。
  • 我在 Qt (MyCodec) 中创建了一个新的静态库项目,该项目目前定义了一个名为 MyDecoder 的类。
  • 作为一个库,我的假设是,要添加 MyEncoder,我只需创建另一个类/头文件。
  • 接下来发生的事情是我不确定的地方。我只是建立图书馆吗?我的理解是它将创建(在 Windows 中)一个 .lib 和一个 .h 文件。在这一步之前我应该​​做些什么?是否有选项会影响我与之交互的方式?
  • 我是否只是在我的程序中包含该头文件来访问我编写的两个类?
  • 我找到了很多关于将 .lib 文件添加到 Qt 项目的答案,所以我不需要这些信息。

  • 原始问题:(上下文)

    我最初的想法是创建包含 MyEncoder 和 MyDecoder 类的 MyLib 将是最方便的。
  • 如果我这样做,我是否只在标题中声明两个类?
  • 为了可移植性和体验,我想从这个库中创建一个 DLL。我确信有很多关于创建和使用 DLL 的信息(这不是这个问题的主题),但是如果有一个特别好的教程(对于 Qt),请传递它。
  • 我的假设是最好为 MyEncoder 和 MyDecoder 使用单独的命名空间,而不是为 MyLib 使用一个命名空间?

  • 我可以看到这种方法的一个折衷是应用程序的大小,因为包含 MyLib.h 将包含编码器和解码器的代码(如果编码器和解码器是单独的应用程序)。这是假设我没有使用 DLL。

    我想我得到的是:
  • 有哪些方法可用(和推荐)?
  • 每个的权衡是什么?
  • 在哪里可以找到有关此特定主题的文档(教程/示例)?我的搜索努力并没有产生多少结果。

  • 如果它有助于更​​具体,我正在使用 Qt Creator 中的 Qt 4.7.4 进行开发。

    最佳答案

    C++ 中关于库的一种“最佳实践”通常是“您为所使用的东西付费”。

    这如何适用于您的问题是您将 MyEncoder 和 MyDecoder 放在单独的头文件中。因此,如果用户想使用 MyEncoder,他将包含 MyEncoder.h,如果他想使用 MyDecoder,他将包含 MyDecoder.h,如果他想同时使用两者,他将包含两个 header 。

    链接器通常只包含您在可执行文件中使用的代码部分,因此就代码大小而言没有损失,但编译时间有损失,特别是如果您开始在类中使用高级模板技术.在大型项目中,编译时间可能会很长,因此能够只包含您将要使用的内容非常重要。

    当然,有时用一个标题包含所有内容也很方便。所以你可以拥有的是:

  • MyEncoder.h
  • MyDecoder.h
  • MyCodec.h

  • 然后 MyCodec.h 可以同时包含 MyEncoder.h 和 MyDecoder.h

    假设 MyEncoder 和 MyDecoder 旨在对相同类型的数据进行操作,可能没有充分的理由将 MyEncoder 和 MyDecoder 放在不同的命名空间中。

    您可能想要类似 MyCodec 命名空间的东西,并在该命名空间中声明 MyEncoder 和 MyDecoder。

    针对您的修订版进行了更新:



    这是一个正确的假设。



    我有一段时间没有使用 Qt creator,所以我无法权威地谈论它或如何访问相关选项。但作为一般规则,您至少需要 2 个版本的库;一个调试版本和一个发布版本。如果您的库使用 Qt 库,那么当应用程序链接到您库的调试版本时,它们将需要在其路径中包含 Qt 共享库的调试版本,如果它们链接到您的发布版本,则需要有 Qt 库的发行版。

    还可以选择是静态链接到 C++ 标准运行时库,还是动态链接到 DLL。

    但基本上是的,您只需构建库,然后使用它的应用程序会将库链接到可执行文件。



    您包括头文件,并链接到 .lib 文件。这就是你应该做的。

    关于c++ - 创建具有多个类的库的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8883410/

    10-12 16:48