应该如何命名特定于平台的lib文件?

时间:2010-03-18 11:12:16

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

我正在开发一个C ++项目,该项目可以生成其他团队使用的库。它的制作方式有几种:

  1. Win32 Debug Dynamic
  2. Win32 Debug Static
  3. Win32 Release Dynamic
  4. Win32 Release Static
  5. x64 Debug Dynamic
  6. x64 Debug Static
  7. x64 Release Dynamic
  8. x64 Release Static
  9. 我想知道如何命名dll以及针对不同命名约定的参数有什么最好的智慧。我是否将libs输出到不同的目录中,或者在lib的末尾添加一些字母以区分它们或其他什么?一个问题是,如果我使用目录,但不给所有的库提供不同的名称,那么库的用户会在他们意外使用错误的库时遇到问题。这些担忧是否有效?

    非常感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

  1. 编译主要版本(即“vc80”,“vc91”等)
  2. 运行时版本(即“mt”,“mdd”等)
  3. 您的图书馆版本(即“1.0”,“2.1.1234”等)
  4. 例如,如果您的库名为“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),但这确实是一个小问题。似乎并没有阻止人们使用助推器。

答案 2 :(得分:1)

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