为什么VisualStudio要寻找这个lib文件?LNK1104错误。

7

我们有一个使用VS2008和boost 1_42的大型项目。我试图升级到VS2010和boost 1_44。我安装了VS2010和boost 1_44并转换了项目。现在我正在尝试构建,一切都编译通过,但在链接时失败:

LINK:致命错误LNK1104:无法打开文件'libboost_thread-vc90-mt-1_42.lib'

我已将包含和库目录更改为指向新的boost 1_44文件,并将旧的boost 1_42目录重命名。

为什么链接器仍在寻找一个vc90-1_42文件,而它只使用1_44头文件?有没有办法确定链接器为什么要这个文件?链接器显然认为它需要这个文件,但是为什么呢?

我已经清理了项目,正在重新构建以确保删除任何旧的构建文件。


1
好的,我找到了我的问题所在,但我仍然想知道“如何查明链接器为什么需要这个文件?”。 我的项目依赖于我们使用boost 1_42构建的一个库文件。我使用boost 1_44重新编译了lib文件,主项目上的链接器错误消失了。是否有一些日志或实用程序可以用来查看发生了什么? - JPhi1618
1
我非常确定没有这样的信息(“需要链接到some_lib”),这种信息可能深藏在生成的obj和lib文件中。 - Benoît
4个回答

7
我也遇到过这个问题几次。通常是一些旧的临时文件,但像你这种情况清理并不总能立即解决问题。您的项目是否包含任何可能已使用1.42构建的静态库?
以下是您可以尝试的内容,可能有助于跟踪问题:
将旧的boost目录重命名为其原始名称
清理解决方案
在C/C++-> Command Line-> Additional Options下添加“/showIncludes”
在链接器->命令行->附加选项下添加“/verbose:lib”
重新构建所有
然后,在构建时,您将能够在输出窗口中看到1.42头文件被包含的位置等信息。以某种方式,这样做有助于我找出问题所在。

4

除了更改lib目录,您还需要更改boost库的名称。这在项目设置的链接器|输入部分中。

您添加的注释清楚地表明,Boost 1.42库的依赖关系是由另一个尚未重新构建的库间接创建的。

对此,您基本上有两个选择:将该库作为项目添加到您的主解决方案中,并确保它具有足够的依赖信息,以便在升级Boost时重新构建;或者在构建库时使用{{link1:/Zl}}编译器开关。这告诉编译器,您正在构建一个库,因此不希望像这样嵌入库依赖项。


2
Boost使用自动链接,因此我不需要在链接器|输入部分手动列出所有文件。 - JPhi1618

1
Boost使用
#pragma comment(lib)

这是通知链接器需要链接的库的命令,不是错误。如果 Boost 告诉你需要它,那么很可能确实需要。


我认为这是一个错误,因为boost 1_44没有理由需要boost 1_42的库文件。 - JPhi1618
可能是Boost中出现了一个bug,但我不太相信。 - Benoît
我认为Jerry Coffin是正确的。你可能依赖于一些其他库(自制的或非自制的),这些库依赖于boost 1.42。因此,你遇到了自动链接问题。 - Benoît
是的,但真正的问题是我如何查看这些依赖关系?如果没有其他信息可供参考,我如何确定链接器为什么需要那个文件... - JPhi1618

1

如何找出链接器为什么需要这个文件?

有一些程序可以遍历您的应用程序和dlls/libs,并报告清单的内容以及二进制文件所依赖的内容。然后,您可以扫描报告以查找包含的意外库。我们主要使用它来查找包含先前版本的VC运行时的库。

虽然我们已经五年没有使用过我们拥有的那个程序了,但如果我能记住该应用程序的名称就好了!

DependancyWalker (depends.exe) 可以让您查看dll/exe的依赖关系,但不能查看静态库。

您可以在MSVS中将每个二进制文件作为“文件”打开,并手动查看清单内容,但我想这可能会有点痛苦。我还没有尝试过使用静态库进行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接