4

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

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

我很想分发两个,32 位和 64 位。

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

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

4

3 回答 3

6

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

快速说明克里斯的回答(不想降低因为它大多是好的,但是......):

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

于 2008-10-10T04:50:15.367 回答
2

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

  1. 打开项目属性。
  2. 转到配置属性 | C/C++ | 代码生成部分。
  3. 将运行时库设置为多线程 (/MT)。
于 2008-10-10T04:43:16.380 回答
0

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

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

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

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

于 2008-10-10T03:54:14.780 回答