我正在尝试创建一个用于Windows / MSVC的c ++库。
我的问题是,为了正确链接,我需要分发一堆不同的版本,链接到不同版本的MSVC的c ++运行时 - 单线程和多线程,调试和发布,不同的编译器版本,各种其他安全和其他选择。
我喜欢分发两个,32位和64位。
我的想法是为我的所有STL类型使用不同的新运算符(比如,mynew)和自定义分配器。创建lib时,/ nodefaultlib。然后,当从父项目链接时,要求他们将mynew转换为new,并将我的stl分配器转换为标准的(或者他们选择的一个)。我想我需要删除,以及其他一些功能。当然,我会提供一个示例图库的thunking实现,但这有望让每个人都很头疼。
这可能吗?有没有人试过这个?是否有关于在Windows / MSVC上创建/分发库的最佳实践?
答案 0 :(得分:6)
您需要静态链接,作为一般答案。
关于克里斯回答的快速说明(不想取消助力因为它主要是好的,但......):
请勿链接到msvcrt.dll(未版本的);这是特定于操作系统的版本DLL,如果链接到它,您的应用程序可能无法在其他版本的Windows上运行。据我所知,你应该始终链接到msvcrt ##。dll。 DDK可能包含一个lib,但除非你真的知道你在做什么,否则不要链接到它。
答案 1 :(得分:2)
静态链接到C ++运行时库:
答案 2 :(得分:0)
如果您使用C ++,则不需要使用自定义分配器,并且您可以在std::tr1::shared_ptr
周围包装所有分配(您可以在其中指定释放功能)。这确保了即使客户端释放对共享指针的最后一个引用,它仍然是库(或库的CRT)中的代码,当要释放对象时,它会被调用。
这是解决“DLL border hell”的一种方法。希望能帮助到你! : - )
编辑:我想我误解了你问题的意图。因为你担心DLL边界地狱而不是不想要任何依赖CRT,我想你只是想要一个你可以在任何地方安装的DLL版本。在这种情况下,您可以将您的计划链接到msvcrt.dll
。这可以在任何Windows系统上使用。
你没有听到我的意见,但显然在驱动程序开发工具包中你可以找到某种导入库,允许更新版本的Visual Studio链接到msvcrt
。