我正在开发一个C ++项目,该项目可以生成其他团队使用的库。它的制作方式有几种:
我想知道如何命名dll以及针对不同命名约定的参数有什么最好的智慧。我是否将libs输出到不同的目录中,或者在lib的末尾添加一些字母以区分它们或其他什么?一个问题是,如果我使用目录,但不给所有的库提供不同的名称,那么库的用户会在他们意外使用错误的库时遇到问题。这些担忧是否有效?
非常感谢。
答案 0 :(得分:2)
使用Microsoft约定可能是一个好主意。静态版本以“lib”为前缀。调试版本是后固定的“d”。 64位版本位于amd64子目录中。不是最伟大的惯例,但至少它是熟悉的。
在MSVC中,您可以使用预定义的_DLL宏来检测用户是否选择了CRT的DLL版本。如果选择了64位编译,则定义_WIN64宏。足以生成所需的#pragma comment(lib,“name”)指令。
答案 1 :(得分:2)
我认为boost通过在特定平台之后命名.lib文件来处理这个问题。我喜欢包括以下信息:
例如,如果您的库名为“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,...)
指令。