分发Windows C库:如何决定是创建静态库还是动态库?
作者:互联网
我们一直在将Java和.NET API库转换为C,并试图找出将编译版本分发给其他开发人员以与其自定义应用程序一起使用的最佳方法.它应该是静态库还是动态库?
我们需要为Win32和Win64创建(我想每个目标操作系统的Debug和Release版本).考虑到我试图确保所有引用的库都匹配(/ MT与/ MD)所遇到的所有挫折感,我想知道是否有决定在这里制作哪个将为其他开发人员简化它.
当我运行dumpbin / all<静态库文件名> |在静态库上查找/ i“msvc,我没有看到任何运行时引用(不像我在.exe或.dll上做同样的事情).这是否表明运行时尚未链接,这给了开发人员在开发和构建自己的应用程序时,使用/ MT或/ MD更灵活吗?
哪种方法可以让开发人员的生活更轻松?
解决方法:
静态库更容易创建,但更难分发.客户端程序员将把它们链接到他的程序中,因此编译设置与他的兼容非常重要.您必须至少分发4个版本,对应4个不同的CRT版本(/ MD,/ MDd,/ MT,/ MTd).并且您需要将其乘以常用的Visual Studio版本的数量.如果您不知道客户端程序员将要使用什么,那么这可能是一个非常大的列表.
没有DLL的问题,你只为导出的函数声明提供一个.h,一个.lib,它是DLL的导入库(没有代码,只包含名称)和.dll本身.
但是,为您的DLL创建可从任何C或C编译器使用的接口更难.您不能公开任何标准C库类,返回std :: string不会起作用.您无法创建任何分配调用者需要释放的内存的函数.通常不能跨越边界抛出异常.执行任何这些操作往往会导致很难诊断客户端程序员的运行时问题,这是由内存分配器和类对象布局差异不匹配引起的. COM对象模型是这种接口的一个示例.
这不是您使用静态库时遇到的问题.有点意外,它们需要运行时和编译器版本匹配.如果客户端程序员遇到了一个错误的静态库,那么他也会遇到所有这些问题.和更多.静态图书馆就像青少年性行为.你犯了一个错误,并在你的余生中最终支持它.
标签:c,shared-libraries,static-libraries 来源: https://codeday.me/bug/20191007/1866679.html