有人知道部署本地(没有COM,没有.NET) ANSI共享库的最佳实践指南吗?
我们的产品使用zlib,我们在下载页面上分发预构建的二进制文件,这些二进制文件不同于官方zlib页面上的二进制文件。我猜这是因为避免混合C运行时。官方版本是在msvcrt上使用VC++ 6.0构建的,而VS.NET/2005/2008将使用msvcrt 71/80/90。
我想要做的是创建is 2005/8解决方案和项目,这些解决方案和项目将为我们正确地构建zlib,并分发它们来代替我们现在所拥有的。我想小心地这样做,并分发一个适当有用的包,然后我也可以发送给zlib的策展人,以便包含在他们的源发行版中。然而,事实证明,找到可靠的信息是很麻烦的。我有一堆关于Win32编程的书,我在网上找到了很多文章,但是这些似乎都不能彻底地描述你真正需要发布的内容。
例如,zlib分发.exp、.lib存根和.def文件,其中fftw分发.def文件,但不分发.lib存根和.exp文件。我想我可以转储所有看起来有用的东西(或者只是反映官方的zlib当前的功能),但是我想知道为什么它必须在那里,它属于哪些目录。
是否有良好的例子,良好的Windows发行版的库,起源于unix世界?
正式的zlib二进制发行版(向下滚动)
我们的windows发行版
澄清:
我们分发一个库,并向(大部分) Windows用户提供zlib,因为他们通常没有这个库。我希望我们构建的zlib一般都是有用的组件,而不仅仅是我们的产品所使用的.dll。我们是开源的,并且被广泛使用,所以我们确实希望使我们的整个构建环境可用,并且能够很容易地适应您想要使用的任何编译器。
发布于 2009-09-19 04:22:48
如您所知,混合C运行时是一个真正的问题。因此,DLL发行版的一个维度将始终是运行时的选择。有时,这不是一个自由的选择。将由现有应用程序(想想插件)在运行时加载的DLL必须(通常)与宿主应用程序使用的CRT的选择相匹配。
您可能会想象,您可以静态地将CRT链接到您的DLL中,并避免这种担心。出现的问题是,当您必须在DLL和其宿主应用程序之间传递分配的指针时,因为混合运行时的大部分问题来自在一个进程中有多个malloc()和free()的实现。但是,使用为DLL精心设计和实现的API,这可能是解决方案。
像Lua双星这样由马克·拉沙科夫的回答描述的发行版使用大量的构建自动化来安排许多平台和编译器的组合。维护构建过程对其团队来说是一项相当大的工作。当一个单独的组决定创建一个用于Lua的Windows安装程序来为Windows用户提供一个简单的第一次使用体验时,他们决定(我相信明智地)为他们的产品选择一个CRT版本,并要求他们附带的所有扩展all都是根据该单一版本编译的。
作为发行版打包的一部分,您应该遵循的一种做法是使用依赖沃克来验证是否使用了预期的CRT,并且所有其他依赖项都是宿主应用程序安装时的系统DLL,或者也包括在包中。依赖程序可以从批处理文件中运行,因此它可以作为回归测试套件的一部分来自动完成此验证。例如,在发布基于Lua的项目时,我从Makefile中在Dependency下运行最终构建,作为构建安装包的目标的一部分,并使用perl脚本检查日志,以验证所使用的惟一DLL要么是安装的一部分,要么来自系统。
正如其他人所说的那样,如果您的DLL是由不希望使用DLL开发的最终用户使用的(例如独立发布的大型应用程序的插件),那么您需要打包的就是DLL本身(以及它所具有的任何依赖项、最终用户文档等)。在这种情况下,只需确保DLL使用与应用程序相同的运行时。
如果DLL是针对开发人员社区的,那么您很可能是在Lua二进制文件的多个构建案例中。每个分发包都将包含正确构建的DLL、导入库(.LIB)和所有文档。对于VS构建的DLL,这些DLL预期将与其他编译器的代码相链接,因此可以友好地包含记录实际导出名称的.DEF文件。现代MinGW实际上并不需要它,但是Borland的用户或者可能是C以外的语言的用户可以使用他们所能得到的所有帮助。
鉴于最近流行的动态语言(如Lua、Perl、TCL和Python ),这些语言通常可以很容易地绑定到用C实现的库中,如果您可以向这些语言提供绑定,以及根据“本地定制”编译的二进制文件以供选择CRT,这些用户社区也会非常赞赏它。
发布于 2009-09-19 03:46:01
作为参考,我想提一下LuaBinaries。简单的背景是,由于Lua是相当可配置的,他们认为最好有一个“标准”发行版,这样任何人都可以分发字节码编译的Lua脚本,而任何使用“标准”Lua二进制文件的人都可以以相同的结果运行它们。
您将在Windows部分看到下载与表单Lua_5_1_4_Win32_{PLAT}{VER}_lib.zip匹配。{PLAT}可以是Cygwin、VC6-9、MinGW或仅仅是DLL等等。
例如,如果要抓取lua5_1_4_Win32_vc9_lib.zip,就只能找到一个lua5.1.lib文件(加上头文件),因为这是静态库(这个库是用VS2008编译的)。
lua5_1_4_Win32_dll9_lib.zip包含lua5.1.lib和lua5.1.dll -您可以在编译时链接到该.lib,这是您真正需要的。
如果您的唯一目标是Visual,那么在编译成DLL时生成的.lib应该是除了DLL和头文件之外唯一需要的文件--除非您希望用户只调用LoadLibrary和GetProcAddress来访问DLL的所有功能。
据我所知,对.def文件的唯一需要是MinGW与VS之间的互操作DLL。我的理解是,很久以前,VS除了使用.def文件之外,还使用了.libs,但是现在所有的信息和所需的信息都只包含在.lib中。您可以在.lib和.def文件之间进行转换(如果您不能在其中一个文件上编译代码),但这有点麻烦--例如,您必须使用pexports生成一个.def文件。
希望LuaBinaries能够为如何支持许多Win32编译器提供一个很好的参考。但是我真的不确定是否有必要为VS的每个版本创建一个.lib存根,因为我非常确定我已经向使用VS2008的人发送了一个VS2003 .lib和.dll,而且没有遇到任何麻烦。
发布于 2009-09-19 03:52:35
如果您的目标是最终用户(即,您只需要运行您的应用程序),则只需分发dll即可。
https://stackoverflow.com/questions/1447604
复制相似问题