我认为 boost 通过在特定平台之后命名 .lib 文件来解决这个问题。我喜欢包含以下信息:
- 编译器主要版本(即“vc80”、“vc91”等)
- 运行时版本(即“mt”、“mdd”等)
- 您的库版本(即“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。