我正在尝试创建一个用于Windows / MSVC的c ++库。

我的问题是,为了正确链接,我需要分发一堆不同的版本,链接到不同版本的MSVC的c ++运行时 - 单线程和多线程,调试和发布,不同的编译器版本,各种其他安全和其他选择。

我喜欢分发两个,32位和64位。

我的想法是为我的所有STL类型使用不同的新运算符(比如,mynew)和自定义分配器。创建lib时,/ nodefaultlib。然后,当从父项目链接时,要求他们将mynew转换为new,并将我的stl分配器转换为标准的(或他们选择的一个)。我想我需要删除,以及其他一些功能。当然,我会提供一个示例图库的thunking实现,但这有望让每个人都很头疼。

这可能吗?有没有人试过这个?是否有关于在Windows / MSVC上创建/分发库的最佳实践?

有帮助吗?

解决方案

您需要静态链接,作为一般答案。

关于克里斯回答的快速说明(不想取消助力因为它主要是好的,但......):

请勿链接到msvcrt.dll(未版本的);这是特定于操作系统的版本DLL,如果链接到它,您的应用程序可能无法在其他版本的Windows上运行。据我所知,你应该始终链接到msvcrt ##。dll。 DDK可能包含一个lib,但除非你真的知道你在做什么,否则不要链接到它。

其他提示

静态链接到C ++运行时库:

  1. 打开项目属性。
  2. 转到配置属性| C / C ++ |代码生成部分。
  3. 将运行时库设置为多线程(/ MT)。

如果您正在使用C ++,则不需要使用自定义分配器,并且围绕 std :: tr1 :: shared_ptr (您可以在其中指定释放函数)包装所有分配。这确保了即使客户端释放对共享指针的最后一个引用,它仍然是库(或库的CRT)中的代码,当要释放对象时,它会被调用。

这是解决“DLL border hell”的一种方法。希望能帮助到你! : - )

编辑:我想我误解了你问题的意图。因为你担心DLL边界地狱而不是不想要任何依赖CRT,我想你只是想要一个你可以在任何地方安装的DLL版本。在这种情况下,您可以将程序链接到 msvcrt.dll 。这可以在任何Windows系统上使用。

你没有听到我的意见,但显然在驱动程序开发工具包中你可以找到某种导入库,允许更新版本的Visual Studio链接到 msvcrt

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top