代码之家  ›  专栏  ›  技术社区  ›  tfinniga

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

  •  5
  • tfinniga  · 技术社区  · 17 年前

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

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

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

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

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

    3 回复  |  直到 17 年前
        1
  •  6
  •   Nick    17 年前

    一般来说,你想要静态链接。

    关于Chris的回答的简短说明(不想降级,因为它大多很好,但是……):

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

        2
  •  2
  •   Pavel Chuchuva grapeot    17 年前

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

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

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

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

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

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