【问题标题】:How should platform specific lib files be named?应该如何命名平台特定的 lib 文件?
【发布时间】:2010-03-18 11:12:16
【问题描述】:

我正在开发一个 C++ 项目,该项目会生成其他团队使用的库。它有几种不同的口味:

  1. Win32 调试动态
  2. Win32 调试静态
  3. Win32 发布动态
  4. Win32 发布静态
  5. x64 调试动态
  6. x64 调试静态
  7. x64 发布动态
  8. x64 发布静态

我想知道如何命名 dll 以及不同命名约定的参数是什么。我是将库输出到不同的目录中,还是在库的末尾附加一些字母以区分它们,或者其他什么?一个问题是,如果我使用目录,但不给所有库指定不同的名称,库的用户会遇到意外使用错误库的问题。这些担忧有效吗?

非常感谢。

【问题讨论】:

    标签: c++ dll shared-libraries static-libraries


    【解决方案1】:

    使用 Microsoft 约定可能是个好主意。静态版本的前缀为“lib”。调试版本是后置“d”。 64 位版本位于 amd64 子目录中。不是最大的约定,但至少它是熟悉的。

    在 MSVC 中,您可以使用预定义的 _DLL 宏来检测用户选择了 CRT 的 DLL 版本。如果选择 64 位编译,则定义 _WIN64 宏。足以生成所需的#pragma comment(lib, "name") 指令。

    【讨论】:

      【解决方案2】:

      我认为 boost 通过在特定平台之后命名 .lib 文件来解决这个问题。我喜欢包含以下信息:

      1. 编译器主要版本(即“vc80”、“vc91”等)
      2. 运行时版本(即“mt”、“mdd”等)
      3. 您的库版本(即“1.0”、“2.1.1234”等)

      例如,如果您的库名为“NetInfo”,它是 1.2.3 版,它与调试 CRT 动态链接,并且是用 Visual Studio 2005 构建的:

      NetInfo_1.2.3_vc80_mdd
      

      唯一需要担心的是人们将如何使用您的库:静态或动态。我通常的做法是这样的:

      如果您的库链接到动态 CRT,您的库将作为 DLL 提供;否则,您的库将作为静态库提供。原因是,如果人们正在与 CRT 动态链接,那么可以肯定地假设他们不介意与您的库动态链接。如果你想同时提供这两个选项,那么我通常会在末尾加上一个“s”来表示它是一个静态库;缺少“s”表示它是一个动态库。

      例子:

      NetInfo_1.2.3_vc80_mdds.lib - static library, links with dynamic debug CRT
      NetInfo_1.2.3_vc80_mds.lib  - static library, links with dynamic release CRT
      NetInfo_1.2.3_vc80_mtds.lib - static library, links with static debug CRT
      NetInfo_1.2.3_vc80_mts.lib  - static library, links with static release CRT
      NetInfo_1.2.3_vc80_mdd.lib  - import library, links with dynamic debug CRT
      NetInfo_1.2.3_vc80_mdd.dll  - dynamic library, links with dynamic debug CRT
      NetInfo_1.2.3_vc80_md.lib   - import library, links with dynamic release CRT
      NetInfo_1.2.3_vc80_md.dll   - dynamic library, links with dynamic release CRT
      NetInfo_1.2.3_vc80_mtd.lib  - import library, links with static debug CRT
      NetInfo_1.2.3_vc80_mtd.dll  - dynamic library, links with static debug CRT
      NetInfo_1.2.3_vc80_mt.lib   - import library, links with static release CRT
      NetInfo_1.2.3_vc80_mt.dll   - dynamic library, links with static release CRT
      

      这个方法有点额外的工作,但它涵盖了所有的基础。如果你提供不同的平台,那么你也应该在那里粘贴“x86”和“x64”。

      然后在您的头文件中,您可以使用 _WIN64、_DLL 和 _DEBUG 宏来确定要引入哪个库。如果您全力以赴并为所有选项提供静态和动态库,那么您将需要一个额外的定义,例如 NETINFO_USE_STATIC_LIB来决定是引入动态还是静态的味道。

      此方法允许您将所有文件保存在同一目录中,并让您仅通过查看文件名即可了解详细信息。缺点是有些人可能会抱怨加载一个冗长的 dll 而不是一个简单的“NetInfo.dll”(尤其是如果他们使用 LoadLibrary),但这确实是一个小问题。似乎并没有阻止人们使用 boost。

      【讨论】:

        【解决方案3】:

        我将所有不同的风格输出到同一个目录中,使用命名约定来消除歧义。通过将它们放在同一个目录中,链接器目录不必在不同风格之间改变。然后使用一组预处理器指令链接这些库,该指令选择 #pragma (lib,...) 指令来编译正在编译的风格。

        【讨论】:

        • 嗯,是的,好点,我没想过使用#pragma (lib)。这可以很好地选择正确的平台和配置。但是,对于在动态库和静态库之间进行选择可能不是很好。也许用户可以在他们的项目设置中指定 #LIBRARYNAME_STATIC 或 #LIBRARYNAME_DLL 或其他内容来进行此选择。你觉得这样可以吗?
        • 啊,我以为动态/静态是指库链接到动态CRT还是静态CRT。如果您尝试在静态链接和动态链接之间进行选择,则必须使用一些自定义 #define。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 2014-05-17
        相关资源
        最近更新 更多