Visual Studio: LINK: Schwerwiegender Fehler LNK1181: Eingabedatei kann nicht geöffnet werden

75

Ich habe seit einiger Zeit einen seltsamen Fehler in Visual Studio 2010 festgestellt.

Ich habe eine Lösung, die aus einem Projekt besteht, das zu einer statischen Bibliothek kompiliert wird, und einem anderen Projekt, das wirklich einfach ist, aber von dieser Bibliothek abhängt.

Manchmal, in den letzten Tagen sehr häufig, erhalte ich nach dem Neuerstellen der Lösung oder dem Kompilieren mit 1-3 geänderten Quelldateien die folgende Fehlermeldung:

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

Wo das Kompilieren thelibrary.libohne Fehler oder Warnungen erfolgreich war.

Ich habe versucht, die Lösung zu reinigen, aber das funktioniert nicht immer.

  • Was ist hier falsch?
Komn
quelle
6
Ich habe genau das gleiche Problem. Lösung mit 3 nativen C ++ - Projekten. 1 exe und 2 statische Bibliotheken. Beim Rebuild wird immer ein Fehler erwähnt. Danach mache ich einfach Build und es geht ok. Sieh aus wie ein Käfer.
Thims
Ich habe das gleiche Problem. Ich tippe nur 'abc' anstelle von 'abc.lib'. Nach der Korrektur ist alles erledigt.
Doan Quang Viet

Antworten:

42

Fügen Sie in Linker, allgemeinen, zusätzlichen Bibliotheksverzeichnissen, das Verzeichnis der DLL oder .libs hinzu, die Sie in Linker, Input, enthalten haben. Es funktioniert nicht, wenn Sie dies in VC ++ - Verzeichnisse, Bibliotheksverzeichnisse einfügen.

Chris Thorne
quelle
12

Gehe zu:

Project properties -> Linker -> General -> Link Library Dependencies set No.
EkaYuda
quelle
7
Und was ist, wenn ich die abhängige Bibliothek tatsächlich einbinden muss? (Ist das nicht der Hauptgrund, die Bibliothek überhaupt als Abhängigkeit anzugeben
?
11

Ich kann hier nur 1 Dinge sehen: Sie haben in Ihrem Projekt die Abhängigkeiten zu thelibrary.lib nicht richtig festgelegt, was bedeutet, dass thelibrary.lib in der falschen Reihenfolge erstellt wird (oder zur gleichen Zeit, wenn Sie mehr als 1 CPU-Build-Konfiguration haben). was auch die Zufälligkeit des Fehlers erklären kann). (Sie können die Projektabhängigkeiten ändern unter: Menü-> Projekt-> Projektabhängigkeiten)

Sasha
quelle
Die Bibliothek.lib wird immer zuerst erstellt. Ich habe die Abhängigkeiten vor langer Zeit richtig eingestellt.
Komn
In diesem Fall kann es sich um einen VS-Fehler handeln. Versuchen Sie herauszufinden, durch welchen Prozess die Bibliothek thelibrary.lib geöffnet bleibt.
Sasha
Zur Verdeutlichung müssen Sie mit der rechten Maustaste auf Ihr Projekt klicken und zu "Abhängigkeiten
erstellen
7

Ich habe vor kurzem den gleichen Fehler getroffen. Einige Grabungen brachten dies hervor: http://support.microsoft.com/kb/815645

Grundsätzlich ist das schlecht, wenn Sie Leerzeichen im Pfad der .lib haben. Ich weiß nicht, ob das für Sie passiert, scheint aber vernünftigerweise möglich zu sein.

Das Update lautet entweder 1) Setzen Sie die lib-Referenz in "Anführungszeichen" oder 2) fügen Sie den Pfad der lib zu Ihren Bibliotheksverzeichnissen hinzu (Konfigurationseigenschaften >> VC ++ - Verzeichnisse).

Clippy
quelle
Vielen Dank für Ihre Lösung. Ich bin mit solchen Problemen konfrontiert und das, was Sie erwähnt haben, ist richtig. Wenn der Bibliothekssuchpfad Leerzeichen enthält, werden die Bibliotheken nicht erkannt. Ich benutze Visual Studio 2013
StraightCirle
@Clippy Ich bin auf dasselbe gestoßen, als ich das Visual Studio aktualisiert habe. Ich wollte buchstäblich weinen, als ich diese Lösung fand.
Amit Bhaira
4

Ich hatte das gleiche Problem sowohl in VS 2010 als auch in VS 2012. Auf meinem System wurde die erste statische Bibliothek erstellt und dann sofort gelöscht, als das Hauptprojekt mit der Erstellung begann.

Das Problem ist der gemeinsame Zwischenordner für mehrere Projekte. Weisen Sie einfach jedem Projekt einen eigenen Zwischenordner zu.

Lesen Sie mehr dazu hier

alexkr
quelle
Dies passierte mir auch, als ich Projekte für eine neue Lösung ähnlicher Projekte duplizierte. Bitte beachten Sie, dass Sie für Ihre Binärdateien immer noch denselben Ausgabeordner verwenden können, jedoch nicht denselben Zwischenordner.
KayleeFrye_onDeck
3

Ich habe es mit folgendem gelöst:

Gehen Sie zu Ansicht-> Eigenschaftenseiten -> Konfigurationseigenschaften -> Linker -> Eingabe

Fügen Sie unter zusätzlichen Abhängigkeiten die Datei thelibrary.lib hinzu. Verwenden Sie keine Zitate.

user2049230
quelle
2

Ich hatte ein ähnliches Problem, da ich LINK1181Fehler in der .OBJDatei bekam, die Teil des Projekts selbst war (und es gab nur 2 .cxx-Dateien im gesamten Projekt).

Anfangs hatte ich das Projekt so eingerichtet, dass es .EXEin Visual Studio generiert wird , und dann habe Property Pages -> Configuration Properties -> General -> Project Defaults -> Configuration Typeich in .EXE in .DLL geändert. Ich hatte den Verdacht, dass Visual Studio 2008 irgendwie verwirrt war, und habe die gesamte Lösung von Anfang an im DLL-Modus von Grund auf neu erstellt. Das Problem ging danach weg. Ich stelle mir vor, wenn Sie sich manuell durch die .vcproj- und andere verwandte Dateien wühlen, können Sie herausfinden, wie Sie Probleme beheben können, ohne von vorne zu beginnen (aber mein Programm bestand aus zwei .cpp-Dateien, sodass es einfacher war, von vorne zu beginnen).

user1726157
quelle
2

Ich stolpere über das gleiche Thema. Für mich scheint es daran zu liegen, dass zwei Projekte mit demselben Namen voneinander abhängig sind.

Zum Beispiel habe ich ein Projekt namens Foo, das Foo.lib produziert. Ich habe dann ein anderes Projekt, das auch Foo heißt und Foo.exe und Links in Foo.lib produziert.

Ich habe die Dateiaktivität mit Process Monitor beobachtet. Was zu passieren scheint, ist, dass Foo (lib) zuerst erstellt wird - was richtig ist, weil Foo (exe) als abhängig von Foo (lib) markiert ist. Dies ist alles in Ordnung und wird erfolgreich erstellt und im Ausgabeverzeichnis abgelegt - $ (OutDir) $ (TargetName) $ (TargetExt). Dann wird Foo (exe) ausgelöst, um neu zu erstellen. Nun, ein Umbau ist ein sauberer, gefolgt von einem Build. Es scheint, als würde die 'saubere' Phase von Foo.exe Foo.lib aus dem Ausgabeverzeichnis löschen. Dies erklärt auch, warum ein nachfolgender 'Build' funktioniert - das gibt keine Ausgabedateien aus.

Ein Fehler in VS, denke ich.

Leider habe ich keine Lösung für das Problem, da es sich um eine Neuerstellung handelt. Eine Problemumgehung besteht darin, Clean und anschließend Build manuell auszugeben.

Nick
quelle
2

Ich weiß nicht warum, aber ich ändere den Link Linker-> Eingabe-> Zusätzliche Abhängigkeiten von "dxguid.lib" in "C: \ Programme (x86) \ Microsoft DirectX SDK (Juni 2010) \ Lib \ x86 \ dxguid. lib "(in meinem Fall) war das einzige, was funktionierte.

Vic
quelle
1

Für mich war das Problem ein falsches includeVerzeichnis. Ich habe keine Ahnung, warum dies den Fehler mit der scheinbar fehlenden Bibliothek verursacht hat, da das Include-Verzeichnis nur die Header-Dateien enthält. Und für das Bibliotheksverzeichnis wurde der richtige Pfad festgelegt.

mgttlinger
quelle
0

Möglicherweise haben Sie ein Hardwareproblem.

Ich hatte das gleiche Problem auf meinem alten System (AMD 1800 MHz CPU, 1 GB RAM, Windows 7 Ultimate), bis ich den 2x 512 MB RAM in 2x 1 GB RAM änderte . Habe seitdem keine Probleme mehr gehabt. Auch andere (kleinere) Probleme verschwanden. Vermutlich mochten sich diese beiden 512-MB-Module nicht so sehr, weil 2x 512 MB + 1 GB oder 1x 512 MB + 2x 1 GB auch nicht richtig funktionierten.

engf-010
quelle
0

Sie können das Problem mit den Leerzeichen im Pfad auch beheben, indem Sie den Bibliothekspfad im DOS-Format "8.3" angeben.

Um das 8.3-Formular zu erhalten, gehen Sie wie folgt vor (in der Befehlszeile):

DIR /AD /X

rekursiv durch jede Ebene der Verzeichnisse.

Pierre
quelle
0

Ich hatte das gleiche Problem. Es wurde gelöst, indem ein Makro definiert wurde OBJECTS, das alle Linkerobjekte enthält, z.

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

Und dann spezifizieren $(OBJECTS) in der Befehlszeile des Linkers angeben.

Ich benutze allerdings kein Visual Studio , nur nmake und eine .MAK-Datei

Martin van Rijen
quelle
0

Ich hatte den gleichen Fehler beim Ausführen von lib.exe von cmd unter Windows mit einer langen Argumentliste. Anscheinend hat cmd.exe eine maximale Zeilenlänge von ca. 8 KB, was dazu führte, dass die Dateinamen am Ende dieses Schwellenwerts geändert wurden, was zu einem fehlerhaften Dateinamenfehler führte. Meine Lösung bestand darin, die Linie zu kürzen. Ich habe alle Pfade aus Dateinamen entfernt und mit der Option / LIBPATH einen einzelnen Pfad hinzugefügt. zum Beispiel:

/LIBPATH:absolute_path /OUT:outfilename filename1.obj filename2.obj ... filenameN.obj
Haim Itzhayek
quelle
0

Ich habe eine andere Lösung dafür gefunden ...

Eigentlich habe ich das Komma-Trennzeichen zwischen zwei Bibliothekspfaden verpasst. Nach dem Hinzufügen von Common hat es bei mir funktioniert.

Gehe zu: Project properties -> Linker -> General -> Link Library Dependencies Stellen Sie unter diesem Pfad sicher, dass der Pfad der Bibliothek korrekt ist.

Vorheriger Code ( mit Fehler - weil ich vergessen habe, zwei lib-Pfade durch Komma zu trennen):

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

Code nach dem Fix (Nur Bibliotheken mit Komma trennen):

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

Hoffe das wird dir helfen.

Shubham
quelle
0

In meinem Fall hatte ich die Bibliothek mit dem NuGet-Paket (cpprestsdk) installiert und die Bibliothek fälschlicherweise zu den zusätzlichen Abhängigkeiten in den Linker-Einstellungen hinzugefügt. Es stellt sich heraus, dass das Paket alles für Sie erledigt.

Der Linker hat dann versucht, die Bibliothek im Bibliothekspfad zu finden und konnte sie natürlich nicht finden.

Nach dem Entfernen der Bibliothek aus den zusätzlichen Abhängigkeiten wurde alles kompiliert und verknüpft.

Bojan Hrnkas
quelle
-2

Ich habe ein binVerzeichnis auf der Ebene project_dir erstellt und dann ein release/debugVerzeichnis im binOrdner erstellt, wodurch das Problem für mich gelöst wurde.

Ravi Sohal
quelle