是否可以在C ++中构建一个没有依赖关系的DLL?

时间:2008-12-04 17:55:37

标签: c++ dll

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

6 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:7)

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

为调试配置选择多线程调试,为发布配置选择多线程调试。 (不确定VS2008中的名称是否完全相同,但应该“在那里”。明天可以使用VS2008特定的差异进行更新)

此外,正如wbic16所建议的那样,使用依赖性walker来识别其他静态依赖项。

答案 2 :(得分:3)

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

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

编辑:请注意,没有C运行时运行也意味着您没有像malloc()和new那样的简单内存分配功能。

答案 3 :(得分:1)

为此工具提供一个镜头:http://www.dependencywalker.com/。它将让你在给定的exe或dll上遍历你的依赖。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

确保你在发布中经常在调试中构建每个东西,dll与特殊的调试dll链接,这些调试dll通常不随windows一起提供,并会导致依赖性问题。