Visual Studio:链接:致命错误LNK1181:无法打开输入文件


75

我已经在Visual Studio 2010中遇到了一个奇怪的错误,已有一段时间了。

我有一个解决方案,其中包含一个可编译为静态库的项目,以及另一个非常简单但依赖于此库的项目。

有时,在最近的几天里,重建解决方案或仅使用1-3个更改的源文件编译该解决方案后,出现以下错误:

2>LINK : fatal error LNK1181: cannot open input file 'thelibrary.lib'
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========

编译thelibrary.lib成功,没有任何错误或警告的地方。

我曾尝试清洁溶液,但这并不总是有效。

  • 怎么了

6
我有完全一样的问题。3个本机c ++项目的解决方案。1个exe和2个静态库。总是在重建时提到错误。之后,我只做Build就可以了。看起来像个虫子。
2012年

我有同样的问题。我只键入“ abc”,而不是“ abc.lib”。更正后,一切就完成了。
Doan Quang Viet

Answers:


42

在链接器的常规其他库目录中,将该目录添加到您在链接器输入中包含的.dll或.libs中。如果将其放在VC ++目录,库目录中,则它不起作用。


12

去:

Project properties -> Linker -> General -> Link Library Dependencies set No.

7
如果我真的需要链接依赖库怎么办?(不是首先将lib指定为依赖项的主要原因)
rustyx

11

我只看到1种情况:您未在项目中正确设置对thelibrary.lib的依赖关系,这意味着thelibrary.lib的构建顺序错误(或者,如果您有1个以上的CPU构建配置,则同时进行;这也可以解释错误的随机性)。(您可以在以下菜单中更改项目依赖项:Menu-> Project-> Project Dependencies)


Thelibrary.lib始终是首先构建的。很久以前,我已经正确设置了依赖关系。
Komn 2011年

在这种情况下,可能是VS错误。尝试查找哪个进程保持thelibrary.lib打开。
萨沙(Sasha)

为了澄清,您需要右键单击您的项目,转到“构建依赖项”->“项目依赖项”
user8128167

7

我最近遇到了同样的错误。一些挖掘提出了这一点:http : //support.microsoft.com/kb/815645

基本上,如果.lib路径中有空格,那就不好了。不知道这是不是正在发生,但是似乎有可能。

修复方法是1)将lib引用放在“引号”中,或2)将lib的路径添加到库目录(配置属性>> VC ++目录)中。


谢谢您的解决方案,我确实遇到了这类问题,您提到的是正确的。如果库搜索路径中有空格,它将无法检测到库。我正在使用Visual Studio 2013
StraightCirle

@Clippy升级Visual Studio时遇到了同样的问题。当我找到这个解决方案时,我真的想哭。
阿米特·贝拉

4

我在VS 2010和VS 2012中都遇到了同样的问题。在我的系统上,第一个静态库被构建,然后在主项目开始构建时立即被删除。

问题是几个项目的公用中间文件夹。只需为每个项目分配单独的中间文件夹。

这里阅读更多


当我为类似项目的新解决方案复制项目时,这也发生在我身上。请注意,您仍然可以对二进制文件使用相同的输出文件夹,只是不能使用相同的中间文件夹。
kayleeFrye_onDeck

3

我用以下方法解决了它:

转到查看->属性页->配置属性->链接器->输入

在其他依赖项下,添加thelibrary.lib。不要使用任何引号。


2

我有一个类似的问题,因为我在属于项目本身LINK1181.OBJ文件中出错(整个项目中只有2个.cxx文件)。

最初,我已将项目设置为.EXE在Visual Studio中生成一个,然后在中 Property Pages -> Configuration Properties -> General -> Project Defaults -> Configuration Type,我将.EXE更改为.DLL。怀疑Visual Studio 2008有点混乱,我从一开始就使用.DLL模式从头开始重新创建了整个解决方案。之后问题就消失了。我想像一下,如果您手动选择.vcproj和其他相关文件的方法,便可以弄清楚如何解决问题而无需从头开始(但我的程序由两个.cpp文件组成,因此更容易重新开始)。


2

我正陷入同样的​​问题。对我来说,这似乎是由两个具有相同名称的项目引起的,一个项目取决于另一个项目。

例如,我有一个名为Foo的项目,它生成Foo.lib。然后,我还有另一个也称为Foo的项目,该项目生成Foo.exe并在Foo.lib中进行链接。

我观看了带有过程监视器的文件活动。似乎正在发生的事情是首先构建了Foo(lib),这是正确的,因为Foo(exe)被标记为依赖于Foo(lib)。一切都很好并且可以成功构建,并将其放置在输出目录中-$(OutDir)$(TargetName)$(TargetExt)。然后触发Foo(exe)进行重建。好吧,重建是干净的,然后是建造。Foo.exe的“清理”阶段似乎是从输出目录中删除Foo.lib。这也解释了为什么后续的“构建”起作用的原因-不会删除输出文件。

我猜是VS中的错误。

不幸的是,由于涉及重建,因此我没有解决问题的方法。一种解决方法是手动发布“清理”,然后发布。


2

我不知道为什么,但是将链接器->输入->其他依赖项引用从“ dxguid.lib”更改为“ C:\ Program Files(x86)\ Microsoft DirectX SDK(2010年6月)\ Lib \ x86 \ dxguid。 lib”(以我为例)是唯一有效的方法。


1

对我来说,问题是一个错误的include目录。我不知道为什么这会导致似乎缺少lib的错误,因为include目录仅包含头文件。并且库目录设置了正确的路径。


0

也许您有硬件问题。

在旧系统(AMD 1800 MHz CPU,1GB RAM,Windows 7 Ultimate)上,我遇到了同样的问题,直到将2x 512 MB RAM更改为2x 1GB RAM。此后没有任何问题。其他(次要)问题也消失了。猜猜这两个512 MB模块彼此不太喜欢,因为2x 512 MB + 1GB1x 512 MB + 2x 1GB也不正常。


0

您也可以通过以DOS“ 8.3”格式指定库路径来解决路径中的空格问题。

要获取8.3表单,请执行以下操作(在命令行中):

DIR /AD /X

递归遍历目录的每个级别。


0

我有同样的问题。通过定义OBJECTS包含所有链接器对象的宏来解决它,例如:

OBJECTS = target.exe kernel32.lib mylib.lib (etc)

然后$(OBJECTS)在链接器的命令行上指定。

我不使用Visual Studio,只是nmake和.MAK文件


0

在带有长参数列表的Windows上从cmd运行lib.exe时出现相同的错误。显然,cmd.exe的最大行长约为8K个字符,这导致此阈值末尾的文件名被更改,从而导致严重的文件名错误。我的解决方案是修剪线。我从文件名中删除了所有路径,并使用/ LIBPATH选项添加了单个路径。例如:

/LIBPATH:absolute_path /OUT:outfilename filename1.obj filename2.obj ... filenameN.obj

0

我为此找到了另一种解决方案...

实际上,我错过了两个库路径之间的逗号分隔符。加入共同点后对我有用。

转到:Project properties -> Linker -> General -> Link Library Dependencies 在此路径上,确保库的路径正确。

先前的代码(带有Bug-因为我忘记了用逗号分隔两个lib路径):

<Link><AdditionalLibraryDirectories>..\..\Build\lib\$(Configuration)**..\..\Build\Release;**%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

修复后的代码(只需用逗号分隔库即可):

<Link><AdditionalLibraryDirectories>..\..\Build\lib\$(Configuration)**;..\..\Build\Release;**%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

希望这会帮助你。


0

在我的情况下,我使用NuGet软件包(cpprestsdk)安装了该库,并且错误地将该库添加到链接器设置中的“其他依赖关系”中。事实证明,包装为您完成了所有工作。

链接器然后尝试在库路径中找到该库,当然找不到它。

从附加依赖项中删除库后,所有内容都可以编译和链接。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.