【问题标题】:Visual Studio: LINK : fatal error LNK1181: cannot open input fileVisual Studio:链接:致命错误 LNK1181:无法打开输入文件
【发布时间】:2011-09-21 00:49:20
【问题描述】:

一段时间以来,我一直在 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 是成功的,没有任何错误或警告。

我已尝试清洁解决方案,但这并不总是有效。

  • 这里出了什么问题?

【问题讨论】:

  • 我也有同样的问题。具有 3 个本机 c++ 项目的解决方案。 1个exe和2个静态库。总是在重建时提到错误。之后我只是做构建,它就可以了。看起来像一个错误。
  • 我也有同样的问题。我只输入“abc”而不是“abc.lib”。改正后,一切就搞定了。

标签: c++ visual-studio compiler-construction


【解决方案1】:

不完全是 OP 问题的答案,因为我使用 CMake 和 Visual Studio 作为生成器,但我个人也遇到了同样的问题(我使用的是 Visual Studio 工具链,而不是 IDE 来构建东西)。

我的解决方法是在目标链接库之前先链接库目录的目录(我有几个)。

//Works
target_link_directories(MyExe PRIVATE /out/of/scope/path/to/lib)
foreach(X IN LISTS LIBSLISTNAMES)
    target_link_libraries(MyExe ${X})
endforeach()

//Throws cannot open cannot open input file error
 foreach(X IN LISTS LIBSLISTNAMES)
    target_link_libraries(MyExe /out/of/scope/path/to/lib/${X})
endforeach()

不确定幕后发生了什么,但也许 VS IDE 在某处有相同的设置?

【讨论】:

    【解决方案2】:

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

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

    从附加依赖项中删除库后,一切编译和链接都很好。

    【讨论】:

      【解决方案3】:

      我为此找到了不同的解决方案...

      实际上,我错过了两个库路径之间的逗号分隔符。添加 common 后它对我有用。

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

      以前的代码(有错误 - 因为我忘了用逗号分隔两个库路径):

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

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

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

      希望这会对你有所帮助。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

            您还可以通过指定 DOS "8.3" 格式的库路径来修复路径中的空格问题。

            要获得 8.3 形式,请执行(在命令行):

            DIR /AD /X
            

            递归遍历目录的每一级。

            【讨论】:

              【解决方案7】:

              我在 project_dir 级别创建了一个bin 目录,然后在bin 文件夹内创建了一个release/debug 目录,这为我解决了这个问题。

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

                  我不知道为什么,但是将 Linker->Input->Additional Dependencies 引用从“dxguid.lib”更改为“C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86 \dxguid.lib"(在我的例子中)是唯一有效的东西。

                  【讨论】:

                    【解决方案10】:

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

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

                    阅读更多关于here

                    【讨论】:

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

                    我遇到了同样的问题。对我来说,这似乎是由于有 2 个同名项目,一个取决于另一个。

                    例如,我有一个名为 Foo 的项目,它生成 Foo.lib。然后我有另一个项目,它也被命名为 Foo,它在 Foo.lib 中生成 Foo.exe 和链接。

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

                    我猜是 VS 中的一个错误。

                    很遗憾,我没有解决问题的方法,因为它涉及重建。一种解决方法是手动发出 Clean,然后 Build。

                    【讨论】:

                      【解决方案12】:

                      我用以下方法解决了它:

                      转到视图-> 属性页-> 配置属性-> 链接器-> 输入

                      在附加依赖项下添加 thelibrary.lib。不要使用任何引用。

                      【讨论】:

                        【解决方案13】:

                        转到:

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

                        【讨论】:

                        • 如果我真的需要链接的依赖库怎么办? (这不是首先将 lib 指定为依赖项的主要原因)
                        【解决方案14】:

                        我遇到了类似的问题,因为我在作为项目本身一部分的 .OBJ 文件上收到了 LINK1181 错误(整个项目中只有 2 个 .cxx 文件)。

                        最初我设置项目以在 Visual Studio 中生成 .EXE,然后在 Property Pages -&gt; Configuration Properties -&gt; General -&gt; Project Defaults -&gt; Configuration Type,我将 .EXE 更改为 .DLL。怀疑 Visual Studio 2008 不知何故变得混乱,我从一开始就使用 .DLL 模式重新创建了整个解决方案。之后问题就消失了。我想如果您手动选择 .vcproj 和其他相关文件的方式,您可以弄清楚如何在不从头开始的情况下修复问题(但我的程序包含两个 .cpp 文件,因此重新开始更容易)。

                        【讨论】:

                          【解决方案15】:

                          在链接器,一般,附加库目录中,将目录添加到链接器中包含的 .dll 或 .libs,输入。 如果你把它放在 VC++ 目录、库目录中,它就不起作用了。

                          【讨论】:

                            【解决方案16】:

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

                            基本上,如果 .lib 的路径中有空格,那就不好了。不知道这是否是你的情况,但似乎有合理的可能。

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

                            【讨论】:

                            • 感谢您的解决方案,我确实遇到过这类问题,您提到的内容是正确的。如果我们在库搜索路径中有空格,它将无法检测到库。我正在使用 Visual Studio 2013
                            • @Clippy 我在升级 Visual Studio 时遇到了同样的情况。当我找到这个解决方案时,我真的想哭。
                            【解决方案17】:

                            也许你有硬件问题。

                            在我的旧系统(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 也不能正常工作。

                            【讨论】:

                              【解决方案18】:

                              我只能看到这里发生了 1 件事: 您没有在项目中正确设置对 thelibrary.lib 的依赖关系,这意味着 thelibrary.lib 的构建顺序错误(或者同时,如果您有超过 1 个 CPU 构建配置,这也可以解释错误的随机性) . (您可以在菜单->项目->项目依赖项中更改项目依赖项)

                              【讨论】:

                              • Thelibrary.lib总是首先构建。我很久以前就正确设置了依赖关系。
                              • 好吧,在这种情况下,它可能是一个 VS 错误。尝试找出哪个进程使 thelibrary.lib 保持打开状态。
                              • 澄清一下,您需要右键单击您的项目,转到“构建依赖项”->“项目依赖项”
                              猜你喜欢
                              • 2015-08-31
                              • 2014-06-19
                              • 2014-07-14
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2020-06-02
                              • 2017-02-17
                              • 1970-01-01
                              相关资源
                              最近更新 更多