我们有一个使用VS2008和boost 1_42的大型项目。我正在尝试升级到VS2010并提升1_44。我安装了VS2010并提升了1_44并转换了项目。现在我正在尝试构建,并且所有内容都会编译,但在链接时会失败:
LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-1_42.lib'
我已将include和lib目录更改为指向新的boost 1_44文件,并且我已重命名旧的boost 1_42目录。
当链接器仅使用1_44标头时,为什么链接器仍在查找vc90-1_42文件?有没有办法可以确定链接器想要这个文件的原因?链接器显然认为它需要文件,但为什么?
我已经清理了项目,我正在重新构建以确保删除任何旧的构建文件。
答案 0 :(得分:5)
我也遇到了这个问题。它通常是一些旧的临时文件,但在你的情况下,清洁并不总是立即做到这一点。您的项目是否包含可能已使用1.42构建的静态库?
您可以尝试的某些内容可能会或可能不会有助于追踪您的问题: 将旧的boost目录重命名为其原始名称
然后在构建时,您将能够在输出窗口中看到包含1.42标题的位置等。不知何故,这样做有助于我找出问题所在。
答案 1 :(得分:3)
除了更改lib目录外,还需要更改boost库的名称。这是在Linker中项目设置的输入部分。
您添加的评论清楚地表明,Boost 1.42库的依赖是由另一个尚未重建的库间接创建的。
为此,您基本上有两个选择:将该库作为项目添加到主解决方案中,并确保它具有足够的依赖关系信息,以便在升级Boost时重新构建它,或者使用{{3构建库时编译器切换。这告诉编译器你正在构建一个库,所以你不想要嵌入像这样的库依赖。
答案 2 :(得分:0)
Boost使用
#pragma comment(lib)
命令通知链接器需要链接的库。这不是错误。如果Boost说你需要它,你很可能会这样做。
答案 3 :(得分:0)
关于如何找到链接器想要此文件的原因?
有些程序会通过你的应用程序和dll / libs报告清单的内容以及二进制文件所依赖的内容。然后,您可以扫描报告以查找包含的意外库。我们主要使用它来查找包括VC运行时的先前版本的库。
虽然没有使用我们在大约5年内的那个,但现在只要我能记住应用程序的名称!
DependancyWalker(depends.exe)将允许您查看dll / exe的依赖性,但不能查看静态库。
您可以在MSVS中将每个二进制文件打开为“文件”,并手动查看清单内容,但我对此进行成像会有点痛苦。我没有尝试使用静态库。