visual在没有运行时的情况下构建windows c++库

visual Building windows c++ libraries without a runtime?

本文关键字:构建 windows c++ 情况下 运行时 visual      更新时间:2023-10-16

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

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

我希望只分发两个,32位和64位。

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

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

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

关于Chris的回答(不想降低士气,因为这基本上很好,但…):

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

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

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

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

这是解决"DLL边界地狱"的一种方法。希望有帮助!:-)

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

您没有从我那里听到这一消息,但很明显,在驱动程序开发工具包中,您可以找到某种导入库,它允许Visual Studio的新版本链接到msvcrt