【问题标题】:Is it possible to build a DLL in C++ that has no dependencies?是否可以在 C++ 中构建一个没有依赖关系的 DLL?
【发布时间】:2008-12-04 17:55:36
【问题描述】:

我想用我的 C# 应用程序部署一个非常简单的 DLL,但是我在 Visual Studio 2008 中构建的任何 DLL 似乎都依赖于“Microsoft.VC90.CRT”。是否可以在没有这种依赖关系的情况下使用 VS2008 构建 DLL?如何判断导致依赖的原因?

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

    我不确定最新的 VC++ 版本,但以前您可以告诉链接器链接 MSVCRT 运行时库的静态版本,而不是动态 (DLL) 版本。这个选项可能仍然存在。

    【讨论】:

    • 这是一个有趣的想法。似乎 MS 建议不要这样做,但如果它解决了我的问题...
    • 我不同意。当您尝试在动态库中链接静态库时,可能会遇到各种问题。
    • 理论上,只要您从不将指针传入或传出 DLL 接口并根据该指针操作内存分配,就应该“没有”问题。当然在实践中......
    【解决方案2】:

    根据this MSDN page,静态库仍然可用。 转到项目属性、配置属性、C/C++、代码生成、运行时库。

    为调试配置选择多线程调试,为发布配置选择多线程。 (不确定 VS2008 中的名称是否都相同,但应该是“附近的某个地方”。明天可以更新 VS2008 特定的差异)

    另外,正如 wbic16 所建议的,使用依赖遍历器来识别其他静态依赖。

    【讨论】:

      【解决方案3】:

      如果您绝对确定您对 C 运行时没有任何依赖关系,那么您可以通过在链接器 -> 输入项目选项下启用“忽略所有默认库”(/NODEFAULTLIB)标志来避免链接它页。您可能还必须禁用基本运行时检查(在 C/C++ -> 代码生成下将“基本运行时检查”设置为默认值),并且您可能还必须删除入口点(将“无入口点”设置为“是 (/ NOENTRY)" 下链接器 -> 高级)。

      另请参阅http://support.microsoft.com/kb/814472,它提供了一些关于为 C++ 托管扩展构建 DLL 的有用信息。

      编辑:请注意,在没有 C 运行时的情况下运行也意味着您没有像 malloc() 和 new 这样的简单内存分配函数。

      【讨论】:

      • 我认为 NODEFAULTLIB 应该只在极少数情况下使用,当你可以保证标准库没有被使用时。否则,最好将运行时链接为静态。
      【解决方案4】:

      试试这个工具:http://www.dependencywalker.com/。它将让您了解对给定 exe 或 dll 的依赖关系。

      【讨论】:

      • 似乎在VS2008中创建一个空的DLL也有这种依赖关系。我没有添加任何额外的引用或任何东西,只是一个空项目。
      【解决方案5】:

      通过一些工作,libCTiny 仍然可以作为默认库的替代品。这种库使 /NODEFAULTLIB 可用。

      要回答您的第二个问题,使用 /VERBOSE 链接器开关,链接器会告诉您哪些符号来自哪个库。

      【讨论】:

        【解决方案6】:

        确保您在发布中构建的所有内容都像在调试中一样频繁,该 dll 与通常不随 windows 提供的特殊调试 dll 链接,并且会导致依赖性问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 2010-12-27
          • 1970-01-01
          • 2016-04-08
          • 2019-04-05
          • 2018-05-23
          • 1970-01-01
          相关资源
          最近更新 更多