不使用运行时环境生成Windows C++库?

5
我正在尝试创建一个用于Windows/MSVC的C++库。
我的问题是似乎需要分发很多不同版本的库,这些库链接到不同版本的 MSVC 的 C++ 运行库-单线程和多线程、调试和发布、不同的编译器版本、各种其他安全和其他选项。
我希望只需分发两个版本,32 位和 64 位。
我的想法是可能使用不同的 new 操作符(比如 mynew)和自定义分配器来创建所有的 STL 类型。在创建库时使用 /nodefaultlib。然后,在从父项目中链接时,要求将 mynew 转换为 new,将我的 stl 分配器转换为标准分配器(或他们选择的分配器)。我想我还需要做一些 delete 和其他函数。当然,我会提供一个库的示例实现来完成 thunking,这将帮助大家节省很多麻烦。
这是否可行?有人试过这个方法吗?在 Windows/MSVC 上创建/分发库的最佳做法是什么?
3个回答

6
你需要静态链接,这是一个通用的答案。
关于Chris的回答,有个小提示(不想降低价值,但是...):
不要链接到msvcrt.dll(未经版本控制的DLL),这是特定于操作系统的版本DLL,如果你链接到它,你的应用程序可能在其他Windows版本上无法工作。据我所知,你应该总是链接到msvcrt##.dll。DDK可能包含它的库,但是除非你真的知道自己在做什么,否则不要链接到它。

我已经点赞了你的回答。通常情况下,你不想使用msvcrt.dll,而DDK方法据我所知是未记录和不受支持的。因此,“你没有从我这里听到这个”。 :-) - C. K. Young

2

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

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

这并不能使其与多个版本的MSVC兼容。 - Ben Voigt

0
如果您正在使用C ++,并将所有分配包装在std :: tr1 :: shared_ptr (其中可以指定解除分配功能),则不需要使用自定义分配器。这确保即使客户端释放了对共享指针的最后引用,当对象要被释放时,仍然会调用您的库(或库的CRT)中的代码。
这是解决“DLL边界地狱”的一种方法。希望能有所帮助! :-)
编辑:我想我误解了您问题的意图。与其不想在CRT上有任何依赖关系,因为您担心DLL边界地狱,我想您只是想要安装在任何地方的DLL版本。在这种情况下,您可以使程序链接到msvcrt.dll。它在任何Windows系统上都可用。
您没有从我这里听到这个,但显然在驱动程序开发工具包中,您可以找到某种导入库,允许较新版本的Visual Studio链接到msvcrt

我同意你的观点。出于纪念性的原因,我不会编辑我的帖子,但是我已经点赞了你的帖子,其他读者也应该阅读它。:-) - C. K. Young

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接