2

我有一个模板 VS .NET 2003 项目,同事在开发他们的软件时复制和自定义。

似乎模板被更改了一段时间,以将 IgnoreSpecificLibrary 属性设置为具有用于发布和调试构建的 libcmt.lib(即,对于发布和调试,构建应该忽略链接器中的 libcmt.lib)。

一些基于此的项目已经被构建,发布版本拉入 libcmtd.lib(通过查看项目 .map 文件可以明显看出)这似乎导致了一些运行时问题(即一个对话框窗口像断点一样闪现已设置)。

是否将 IgnoreSpecificLibrary 设置为排除 libcmt.lib 会自动使项目链接到 libcmtd.lib?

奇怪的是,构建模板(设置不正确)链接到 libcmt.lib,而一些定制项目(尽管不是全部)链接到 libcmtd.lib。

有任何想法吗?

4

2 回答 2

2

许多项目忽略了 libcmt.lib,因为它与动态版本 msvcrt.lib 冲突。忽略链接器中的 libcmt 会使项目使用 msvcrt.lib 进行编译

于 2010-12-03T12:55:20.613 回答
2

这就是发生的事情:

编译后,链接器获取您的目标文件并创建一个符号表,其中包含尚未完成的符号请求。然后链接器会遍历您的库列表,尝试解析那些未填充的符号。由于您忽略了 libcmt.lib ,因此您的第三方库已留下或添加了一些未解析的符号,并且它包含一个链接器请求以解析来自 licmtd.lib(可能还有其他库)的符号,因为它是使用调试选项编译的。

如果您没有忽略 libcmt.lib,那么这些符号很可能会被 libcmt.lib 解析,并且不需要从 libcmtd.lib 中提取内容(即使它会被视为解析仍然未填充的其他符号)

您也可以尝试忽略 libcmtd.lib。如果您现在得到未解析的外部,那么忽略 libcmt.dll 显然不是一个好主意。

于 2011-01-01T01:38:14.340 回答