分发Windows C++库:如何决定是创建静态库还是动态库?

2024-04-18

我们一直在将 Java 和 .NET API 库转换为 C++,并试图找出将编译版本分发给其他开发人员以与他们的自定义应用程序一起使用的最佳方法。应该是静态库还是动态库?

我们需要为 Win32 和 Win64 创建(我想每个目标操作系统都有调试版本和发布版本)。考虑到我在尝试确保所有引用的库都匹配(/MT 与 /MD)时遇到的所有挫败感,我想知道是否需要在这里做出一个决定来简化其他开发人员的工作。

当我跑步时dumpbin /all <static library file name> | find /i "msvc在静态库上,我没有看到任何运行时引用(与我在 .exe 或 .dll 上执行相同操作时不同)。这是否表明运行时尚未链接,并且这使开发人员在开发和构建自己的应用程序时可以更灵活地创建 /MT 或 /MD?

哪种方法可以让开发人员的生活更轻松?


静态库更容易创建,但是much更难分发。客户端程序员会将它们链接到他们的程序中,因此您的编译设置与他们的兼容非常重要。您必须分发至少 4 个版本,对应于 4 个不同的 CRT 版本(/MD、/MDd、/MT、/MTd)。您需要将其乘以常用的 Visual Studio 版本数量。如果您不知道客户端程序员将使用什么,那么这可能是一个非常大的列表。

对于 DLL 来说这不是问题,您只需为导出的函数声明提供一个 .h,一个作为 DLL 导入库的 .lib(没有代码,只包含名称)和 .dll 本身。

然而,为 DLL 创建可在任何 C 或 C++ 编译器中使用的接口是比较困难的。您不能公开任何标准 C++ 库类,例如返回 std::string 将不起作用。您不能创建任何分配需要由调用者释放的内存的函数。一般来说,您不能跨越边界抛出异常。执行任何这些操作往往会导致客户端程序员很难诊断运行时问题,这是由不匹配的内存分配器和类对象布局差异引起的。 COM 对象模型就是此类接口的一个示例。

这不是静态库会遇到的问题。出于某种偶然,他们require运行时和编译器版本匹配。如果客户端程序员被错误风格的静态库所困扰,那么他们也会遇到所有这些问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分发Windows C++库:如何决定是创建静态库还是动态库? 的相关文章

随机推荐