繁体   English   中英

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

[英]Building windows c++ libraries without a runtime?

我正在尝试创建一个用于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边界地狱”的一种方法。 希望能帮助到你! :-)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM