Visual Studio .NET 2003 - 忽略 libcmt 与 libcmtd 的特定库
Posted
技术标签:
【中文标题】Visual Studio .NET 2003 - 忽略 libcmt 与 libcmtd 的特定库【英文标题】:Visual Studio .NET 2003 - Ignore Specific Library for libcmt vs libcmtd 【发布时间】:2010-12-03 10:24:05 【问题描述】:我有一个模板 VS .NET 2003 项目,同事们在开发他们的软件时复制和自定义。
模板似乎被更改了一段时间,以将 IgnoreSpecificLibrary 属性设置为具有 libcmt.lib 用于发布和调试构建(即对于发布和调试,构建应该忽略链接器中的 libcmt.lib)。
此后构建了一些基于此的项目,发布构建拉入 libcmtd.lib(通过查看项目 .map 文件可以明显看出)这似乎导致了一些运行时问题(即对话框窗口闪现为虽然已经设置了断点)。
将 IgnoreSpecificLibrary 设置为排除 libcmt.lib 是否会自动使项目链接到 libcmtd.lib?
奇怪的是,构建模板(设置不正确)链接到 libcmt.lib,而一些自定义项目(尽管不是全部)链接到 libcmtd.lib。
有什么想法吗?
【问题讨论】:
【参考方案1】:事情是这样的:
编译后,链接器获取您的目标文件并在其他文件中创建 一个符号表,其中包含尚未完成的符号请求。 然后链接器通过您的库列表尝试解决这些问题 未填写的符号。由于您忽略了 libcmt.lib ,因此您的第三方库 留下或添加了一些未解析的符号,并且包含链接器请求 从 licmtd.lib (也许还有其他库)中解决那些问题,因为它 编译时带有调试选项。
如果您没有忽略 libcmt.lib,这些符号很可能会被解析 通过 libcmt.lib 并且无需从 libcmtd.lib 中提取内容(即使 它将被视为解决其他仍未完成的符号)
您也可以尝试忽略 libcmtd.lib。如果您现在得到未解决的外部问题,那么 忽略 libcmt.dll 显然不是一个好主意。
【讨论】:
【参考方案2】:许多项目忽略 libcmt.lib,因为它与动态版本 msvcrt.lib 冲突。 忽略链接器中的 libcmt 会使项目使用 msvcrt.lib 进行编译
【讨论】:
这里的问题是它是用 libcmdt.lib 而不是 libcmt.lib 编译的——这就是我的困惑所在。如果我声明忽略 libcmt.lib,libcmtd.lib 是否会通过消除过程链接? 我后来发现开发人员正在链接另一个库的调试版本(再次在发布配置中)。这会是拉入调试 libcmtd 的触发器吗? @tefd,您对引入 libcmtd 的库的调试版本是正确的。如果您可以获得发布版本,则问题应该得到解决。否则,这就是无视黑客发挥作用的地方。以上是关于Visual Studio .NET 2003 - 忽略 libcmt 与 libcmtd 的特定库的主要内容,如果未能解决你的问题,请参考以下文章
使用 c# 将 Visual Studio .net 2003 转换为 2008
VB.NET - Visual Studio 2003 的“继续”的替代方案
Visual Studio .NET 2003 - 忽略 libcmt 与 libcmtd 的特定库