加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

是否有针对Windows分发本机C库的最佳实践指南?

发布时间:2020-12-14 02:48:07 所属栏目:Windows 来源:网络整理
导读:有没有人知道部署本机(没有COM,没有.NET)ANSI C Windows共享库的最佳实践指南? 我们的产品使用zlib,我们在下载页面上分发预先构建的二进制文件,这些文件与官方zlib页面上的不同.我猜这个的原因是to avoid mixing C runtimes.官方的是使用VC 6.0建立的msvcrt
有没有人知道部署本机(没有COM,没有.NET)ANSI C Windows共享库的最佳实践指南?

我们的产品使用zlib,我们在下载页面上分发预先构建的二进制文件,这些文件与官方zlib页面上的不同.我猜这个的原因是to avoid mixing C runtimes.官方的是使用VC 6.0建立的msvcrt和VS.NET/2005/2008将使用msvcrt71 / 80/90.

我想要做的是创建VS2005 / 8解决方案和项目,这些解决方案和项目将为我们正确构建zlib并将它们分配到我们现在所拥有的位置.我想仔细地做这件事,并分发一个适当的有用的包,然后我也可以发送给zlib的策展人,以包含在他们的源代码发行版中.但是,找到可靠的信息已被证明是麻烦的.我有很多关于Win32编程的书籍,我在网上发现了很多文章,但这些文章似乎没有完全描述你真正需要分发的内容.

例如,zlib分发.exp,.lib存根和.def文件,其中fftw分发.def文件,但不分发.lib存根和.exp文件.我想我可以直接转储那些看起来很有用的东西(或者只是反映官方zlib目前的内容),但我想知道为什么它必须存在于它所属的目录中.

是否有很好的例子来源于unix世界的维护良好的Windows发行版?

Official zlib binary distributions (scroll down)

Our windows distributions

澄清:

我们分发一个库并向(大多数)Windows用户提供zlib,因为他们通常没有它.我希望我们的zlib构建作为一般组件非常有用,而不仅仅是我们的产品消耗的.dll.我们是开源的并且被广泛使用,因此我们希望使我们的整个构建环境可用并且易于适应您想要使用的任何编译器.

解决方法

如您所知,混合C运行时是一个真正的问题.因此,DLL发行版的一个维度始终是运行时的选择.有时这不是一个自由选择.将在运行时由现有应用程序(思想插件)加载的DLL必须(通常)匹配托管应用程序使用的CRT选项.

您可能会想象您可以将CRT静态链接到DLL中并避免担心.出现的问题是当你必须在DLL和它的托管应用程序之间传递分配的指针时,因为混合运行时的大部分麻烦来自于在进程中有多个malloc()和free()的实现.但是,通过精心设计和实现的DLL API,这可以成为解决方案.

像Mark Rushakoff’s answer描述的Lua Binaries这样的发行版使用大量的构建自动化来安排制作如此多的平台和编译器组合.维护构建过程对其团队来说是相当多的工作.当一个单独的小组决定创建一个Windows installer for Lua为Windows用户提供简单的第一次使用体验时,他们决定(我相信明智地)为他们的产品挑选一个CRT版本,并要求他们随附的所有扩展DLL都是针对该单个版本编译.

作为发布包装的一部分,您应该遵循的一种做法是使用Dependency Walker来验证是否使用了预期的CRT,并且所有其他依赖项都是系统DLL,来自您的托管应用程序的安装,或者也包含在您的包中.可以从批处理文件运行依赖性walker,因此可以将其用作回归测试套件的一部分,以自动执行此验证.例如,在发布基于Lua的项目时,我在Makefile中从Dependency Walker运行我的最终构建,作为构建安装包的目标的一部分,并使用perl脚本检查日志以验证所使用的唯一DLL是否为其中一部分我的安装或从系统.

正如其他人所说的那样,如果您的DLL被最终用户使用而不希望与它一起开发(例如,插件到独立分布的大型应用程序)那么您应该打包的所有内容都是DLL本身(以及任何依赖项)有,最终用户文档,如此).在这种情况下,您只需确保DLL使用与应用程序相同的运行时.

如果DLL是针对开发人员社区的,那么您很可能处于Lua Binaries的多版本情况中.每个分发包都包含正确构建的DLL,以及导入库(.LIB)和所有文档.对于由VS构建的DLL,它们与其他编译器的代码相关联,可以友好地包含记录实际导出名称的.DEF文件.现代MinGW实际上并不需要它,但是Borland C的用户或者除了C之外的其他语言可以使用他们可以获得的所有帮助.

鉴于最近动态语言(如Lua,Perl,TCL和Python)的流行程度越来越高,通常可以很容易地绑定到用C语言实现的库,如果你能提供这些语言的绑定,那么这些用户社区也会非常感激,以及针对CRT选择的“本地习惯”编译的二进制文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读