4

vs 报错如:

  1. 找不到 xxx.lib
    如何查看为什么 vs 需要链接 xxx.lib?有跟踪日志吗?我的项目没有使用boost.regex,但是vs报错说找不到regex.lib。所以我想找出代码的哪一部分引用了正则表达式

  2. LNK 错误:LIBCMT.lib: xxx 已在 LIBCMTD.lib 中定义
    我如何检查为什么 vs 还链接 yyy.lib,即使这是一个调试版本?我有 2 个项目,它们链接到相同的库,所有库和项目本身都是 /MTd。但是其中一个会报告上述错误,我认为它不应该链接LIBCMT.lib,因为它是一个发布版本的lib,另一个项目是好的,所以lib文件是正确构建的

VS可以显示链接跟踪吗?

4

2 回答 2

5

1) 让我们从链接器实际上如何知道要链接的内容开始。基本上有2类:

  • 在链接器选项的项目设置中指定的库作为附加输入
  • 使用预编译器指令在代码中添加的库#pragma comment(通常与上述相同,但人们有不同的口味)

否则,您只会获得有关缺失符号的信息,而不是它们来自的实际库。您可以做的是在 Visual Studio 链接器选项设置Show ProgressFor Libraries Searched(或只是/VERBOSE:LIB链接器标志)下提供帮助,这实际上会向您显示在每个库加载后添加了哪些依赖项,这也有助于第 2 点)查看哪些库加载哪个运行-时间。

2) 在 1) 中已经提到,您可以使链接器显示库加载进度,否则如果在您要链接的外部库中使用动态 C 运行时,您可以使用它Dependency Walker来检查库的依赖关系并查找是否需要的 C 运行时 dll 通过 dll 名称中的“d”后缀进行调试或发布。如果库已经与静态运行时链接,那么我猜只有链接器错误会警告你。但我认为大多数重要的库都正确打包和结构化,以便您能够分辨哪些文件包含调试版本以及哪些版本。如果库只有发布版本,那就另当别论了。但我的意思是,你可以重新配置Debug将项目配置为实际链接到发布运行时以满足外部库,当然这会阻止一些调试功能、调试堆等。

于 2013-09-26T12:20:17.250 回答
4

对于缺少 boost 正则表达式库的问题,我认为原因是由于 boost 的默认自动链接行为。如果您包含某些 boost 库的标头之一(不是全部,但正则表达式是其中之一),那么这些将导致 Visual Studio 自动链接到该库。它使用以下形式的特殊编译指示:

#pragma comment(lib, "regex")

这具有自动将标志添加到链接器命令的效果。但是,它仅在编译期间被拾取,因此您不会在项目属性中看到它。在提升的情况下,解决方案非常简单 - 找到boost/config/user.hpp并取消注释该行

#define BOOST_ALL_NO_LIB

这将关闭所有库的自动链接行为。或者,您可以使用#define BOOST_REGEX_NO_LIB仅为正则表达式库更改此设置。

要解决第二个问题,您需要找出哪个库链接到发布版本。尝试选择解决方案中的所有项目并打开属性 -> C++ -> 代码生成。您可能会发现运行时库设置将为空白(因为某些库的选项不同。强制它为正确的线程/单线程调试选项并重建。

于 2013-09-26T12:21:11.017 回答