Schwerwiegender Fehler LNK1104: Datei 'libboost_system-vc110-mt-gd-1_51.lib' kann nicht geöffnet werden.

87

Anscheinend kann ich das nicht zum Laufen bringen. Ich habe eine einfache Konsolenanwendung (die von der websocket++Bibliothek abhängt ) erstellt, die BoostBibliotheken benötigt . Aber wenn ich versuche zu kompilieren, bekomme ich:

Schwerwiegender Fehler LNK1104: Datei 'libboost_system-vc110-mt-gd-1_51.lib' kann nicht geöffnet werden.

Ich habe jedoch den bjam erstellt, der die Bibliothek erstellt hat, (boost_root)/stage/libsund den Pfad zu den Bibliotheken mit dem Compiler verknüpft C++/Additionnals includes.

Wenn ich in (boost_root)/stage/libsdie Datei schaue, libboost_system-vc110-mt-gd-1_51.libist nicht da. Es wird libboost_system-vc110-mt-sgd-1_51.libstattdessen aufgerufen .

Irgendeine Idee?

Rushino
quelle
1
Ich war in der Lage, die libboost_system-vc110-mt-gd-1_51.lib-Datei zu erstellen, die einen vollständigen Build mit bjam ausführt, aber ich erhalte immer noch den Fehler.
Rushino
21
Öffnen Sie das VS2012 developer command prompt, gehen Sie zu Ihrem Boost-Stammverzeichnis und geben Sie ein. Geben Sie bootstrapdann ein, b2und Sie sollten einen vollständigen Satz von Bibliotheksdateien erhalten.
Jesse Good
Haben Sie Ihrem Projekt die Include-Pfade und Linker-Pfade hinzugefügt?
Jesse Good
1
Erstellen Sie Ihre Anwendung mit /MD?
Mahesh
Wenn es in Ordnung ist, herunterzuladen anstatt zu kompilieren, holen Sie sich die Bibliotheken
gorogm

Antworten:

92

Der Parameter C ++ → Allgemein → Zusätzliche Einschlussverzeichnisse dient zum Auflisten von Verzeichnissen, in denen der Compiler nach Header-Dateien sucht.

Sie müssen dem Linker mitteilen, wo nach Bibliotheken gesucht werden soll, zu denen eine Verknüpfung hergestellt werden soll. Um auf diese Einstellung zuzugreifen, klicken Sie im Projektmappen- Explorer mit der rechten Maustaste auf den Projektnamen und dann auf Eigenschaften → Linker → Allgemein → Zusätzliche Bibliotheksverzeichnisse . Geben Sie <boost_path>\stage\libhier ein (dies ist der Pfad, in dem sich die Bibliotheken befinden, wenn Sie Boost mit Standardoptionen erstellen ).

Prätorianer
quelle
Kannst
du
1
@ggsmartboy Dies ist der Pfad, in dem sich die Boost-Quelldateien befinden (derselbe Pfad, den Sie im Compiler auflisten, enthält Pfade, damit die Boost-Header gefunden werden können). In der Antwort wird davon ausgegangen, dass Sie Boost selbst erstellt haben (ohne eine Distribution zu verwenden), indem Sie die Standard-Build-Optionen verwendet haben.
Prätorianer
Genial. Hat mir auch echte Kopfschmerzen erspart. Warum ich dies in der Boost-Dokumentation nicht erkennen konnte (wenn es überhaupt da ist), weiß ich nicht! :)
abwesendmindeduk
2
Die Einstellungen, auf die in dieser Antwort verwiesen wird, werden gefunden, wenn Sie mit der rechten Maustaste auf das Projekt klicken und Eigenschaften auswählen (für Noobs wie mich klicken Sie mit der rechten Maustaste auf die Lösung, gehen Sie zu Extras> Optionen usw. Diese Optionen waren jedoch nicht in allen meinen Projekten vorhanden). VS2013
Mr_and_Mrs_D
1
@Mr_and_Mrs_D Sie haben Recht, ich nahm an, dass der Leser diesen Teil kannte. Aktualisiert.
Prätorianer
94

Dies ist der einfachste Weg für einen Amateur wie mich, der C ++ alleine lernt:

Entpacken Sie zuerst die Boost-Bibliothek in ein Verzeichnis Ihrer Wahl. Ich empfehle c:\directory.

  1. Öffnen Sie Ihr visuelles C ++.
  2. Erstellen Sie ein neues Projekt.
  3. Klicken Sie mit der rechten Maustaste auf das Projekt.
  4. Klicken Sie auf Eigenschaft.
  5. Klicken Sie auf C / C ++.
  6. Klicken Sie auf Allgemein.
  7. Wählen Sie eine zusätzliche Include-Bibliothek aus.
  8. Geben Sie das Bibliotheksziel an. zB c:\boost_1_57_0.
  9. Klicken Sie auf den Pre-Compiler-Header.
  10. Klicken Sie auf vorkompilierten Header erstellen / verwenden.
  11. Wählen Sie nicht vorkompilierten Header verwenden.

Gehen Sie dann zur Linkbibliothek, in der Sie Probleme hatten.

  1. Gehe zu wo die extrahierte Datei war c:\boost_1_57_0.
  2. Klicken Sie auf booststrap.bat(geben Sie nicht das Befehlsfenster ein, warten Sie einfach und schließen Sie nicht das Fenster, in dem ich mein Problem hatte, dessen Lösung zwei Wochen gedauert hat. Nach einer Weile booststrapwird das ausgeführt und die gleiche Datei erstellt. aber jetzt mit zwei verschiedenen Namen: b2und bjam.
  3. Klicken Sie auf b2und warten Sie, bis es ausgeführt wird.
  4. Klicken Sie auf bjamund warten Sie, bis es ausgeführt wird. Dann wird ein Ordner mit dem Namen erstellt stage.
  5. Klicken Sie mit der rechten Maustaste auf das Projekt.
  6. Klicken Sie auf Eigenschaft.
  7. Klicken Sie auf Linker.
  8. Klicken Sie auf Allgemein.
  9. Klicken Sie auf Zusätzliches Bibliotheksverzeichnis einschließen.
  10. Wählen Sie den Teil der Bibliothek aus, z c:\boost_1_57_0\stage\lib.

Und du kannst loslegen!

Wu Jie
quelle
3
Vielen Dank Wu Jie - ich hatte so etwas noch nie zuvor gemacht und diese Schritte waren genau das, was ich brauchte, um Boost zu erstellen und die fehlende Bibliotheksdatei 'libboost_serialization-vc140-mt-gd-1_57.lib' zu erstellen. Ich hatte Probleme beim Verknüpfen: )
Vixxd
5
Danke, ich mag nette detaillierte Anweisungen. Für Schritt 2/3/4 des Einrichtens von Boost habe ich stattdessen Folgendes getan: a) Öffnen Sie eine Eingabeaufforderung als root ; b) in das Verzeichnis boost_1_57_0 wechseln; c) Typ bootstrap.bat(es dauerte 10-20 Sekunden); d) Geben Sie ./b2wie angegeben ein (es dauerte dann 30-40 Minuten).
Darren Cook
1
Ich musste bootstrap.bat über die Visual Studio-Eingabeaufforderung öffnen , da die reguläre Eingabeaufforderung nicht wusste, wie der Befehl 'cl' verarbeitet werden soll.
Jlaverde
20.02.2008, Ihre Lösung funktioniert für mich (VS2017 + Boost 1.66). Ich danke dir sehr.
CaTx
Vielen Dank für die Schritte für Anfänger. Ich wünschte, jeder würde immer Antworten geben, wie Sie sie gegeben haben.
Mudit Jain
6

Ich hatte das gleiche Problem. Dies wurde verursacht, weil ich den Boost mit Visual C ++ 2010 (v100) kompiliert und versehentlich versucht habe, die Bibliothek mit Visual Studio 2012 (v110) zu verwenden.

Daher habe ich die Konfigurationen (in Visual Studio 2012) unter Projekteigenschaften -> Allgemein -> Plataform Toolset geändert und den Wert von Visual Studio 2012 (v110) in Visual Studio 2010 (v100) geändert .

Jota Santos
quelle
7
Ich hoffe, Sie erkennen, dass Sie, wenn Sie das Plattform-Toolset auf v100 ändern, die VS2012-IDE anweisen, den mit VS2010 gelieferten Compiler zu verwenden. Alle C ++ 11-Funktionen, die dem VS2012-Compiler hinzugefügt wurden, sind nicht verfügbar. Eine bessere Lösung besteht darin, Boost mit dem VS2012-Compiler zu kompilieren. Sie können die generierten Bibliotheken aus 2010 und 2012 nebeneinander existieren lassen, da Boost die Versionsnummer des Compilers in die Ausgabedateinamen einfügt.
Prätorianer
Du hast recht und ich bin mir bewusst. Ich habe Angst davor, was passieren könnte, wenn ich die Bibliotheken und den Compiler aktualisiere. Wenn das Projekt abgeschlossen ist, werde ich all diese Probleme beheben. Vielen Dank!
Jota Santos
6

Noch eine andere Lösung:

Ich war ratlos, weil ich boost_regex-vc120-mt-gd-1_58.lib in meine Eigenschaft Link-> Zusätzliche Abhängigkeiten aufgenommen habe, aber der Link sagte mir immer wieder, dass libboost_regex-vc120-mt-gd-1_58.lib nicht geöffnet werden konnte ( Beachten Sie das lib-Präfix. Ich habe libboost_regex-vc120-mt-gd-1_58.lib nicht angegeben.

Ich habe versucht, die dynamischen Boost-Bibliotheken (.dlls) zu verwenden (und hatte sie erstellt), aber das Makro BOOST_ALL_DYN_LINK war nicht definiert. Anscheinend enthält die Kompilierung Hinweise zum Einfügen einer Bibliothek, und ohne BOOST_ALL_DYN_LINK wird nach der statischen Bibliothek (mit dem Präfix lib) gesucht, nicht nach der dynamischen Bibliothek (ohne das Präfix lib).

wdtj
quelle
Immer noch nur 1 Gegenstimme, aber ich bin alle paar Monate hier und werde erneut daran erinnert, was die Lösung für mein Problem ist !!
Neil Gatenby
3

Ich hatte das gleiche Problem und mein Fehler war, dass ich die Binärdatei boost_1_55_0-msvc-11.0-32.exe für Visual C ++ 2010 installiert hatte, die die Version v100 (Projekteigenschaften-> ConfiguratioProperties-> General-> platformTooset) und nicht v110 hat als visuelles c ++ 2012. Also habe ich boost_1_55_0-msvc-10.0-32.exe heruntergeladen und jetzt ist alles in Ordnung.

Plinio
quelle
2

Falls Sie Probleme beim Erstellen von Boost haben oder dies lieber nicht tun möchten, können Sie alternativ die lib-Dateien von SourceForge herunterladen . Über den Link gelangen Sie zu einem Ordner mit komprimierten lib- und dll-Dateien für Version 1.51. Sie sollten jedoch in der Lage sein, den Link zu bearbeiten, um die Version Ihrer Wahl anzugeben. Anscheinend hat der Installer von BoostPro einige Probleme.

Bob Bryan
quelle
2

Ich hatte ein ähnliches Problem beim Versuch, Boost-Unit-Tests in Visual Studio 2015 (Community Edition) zu verwenden:

Schwerwiegender Fehler LNK1104: libboost_unit_test_framework-vc140-mt-1_57

Also dachte ich, ich würde meine Lösung teilen.

Sie können ein Boost-Unit-Testprojekt auf zwei Arten erstellen (und diese Lösung funktioniert für beide):

  1. Verwenden des Boost Unit Test Adapters
  2. oder indem Sie eine Win32-Konsolenanwendung erstellen ( Schritte hier ) und die Hauptfunktion durch eine Testfunktion für Boost-Einheiten ersetzen ( Schritte hier ).

Hier sind die Schritte, die ich befolgt habe, um beide Projekte zum Laufen zu bringen:

Laden Sie zunächst die gewünschte Boost-Version herunter (z. B. boost_1_57_0 ). Sie können Boost entweder mit den richtigen Binärdateien herunterladen (kompiliert mit msvc v140) oder die Binärdateien selbst extrahieren, indem Sie die folgenden Befehle über die Befehlszeile ausführen:

  1. bootstrap.bat
  2. "C: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ VC \ vcvarsall.bat" x86
  3. bjam - sauber
  4. bjam -j4 --debug-symbole = on --build-type = vollständiges Toolset = msvc-14.0 Threading = Multi-Laufzeit-Link = gemeinsames Adressmodell = 32

Wobei msvc-14.0 angibt, dass wir die Visual Studio 2015-Version benötigen (VS 2015 = v14.0 = v140), und address-model = 32 angibt, dass wir Plattform 32 benötigen (dasselbe kann jedoch für 64-Bit durchgeführt werden).

Sobald Sie die Binärdateien haben, gehen Sie zu Visual Studio und wählen Sie das von Ihnen erstellte Boost Unit Testing-Projekt aus. Gehen Sie zu Projekteigenschaften> Konfiguration (im Hauptmenü) und treffen Sie die folgenden Optionen:

  • Stellen Sie das " General> Platform Toolset " auf Visual Studio 2015 (v140) ein.

  • Fügen Sie den Pfad zum Boost-Ordner (z. B. C: \ boost_1_57_0) und den Pfad zum Unterordner mit den Binärdateien (z. B. C: \ boost_1_57_0 \ stage \ lib) in:

    • " C \ C ++> Zusätzliches Include-Verzeichnis "
    • und " Linker> Zusätzliche Bibliotheksverzeichnisse ".
Aciel
quelle
0

Ich hatte das gleiche Problem hier gemeldet. Ich habe das Problem behoben, bei dem die Datei mainTest.cpp von einem Unterordner src / mainTest / in den Hauptordner src / verschoben wurde. Ich denke, dies war auch Ihr Problem.

Fiorentinoing
quelle
0

2>LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc120-mt-sgd-1_55.lib

In meinem Fall war bootstrap / bjam für ein altes geerbtes Projekt nicht verfügbar (Bibliotheken wurden vorkompiliert und in SCM festgeschrieben). Bibliotheken hatten keine VC- oder BOOST-Versionierung in ihren Dateinamen, zB: libboost_regex-mt-sgd.libwurde jedoch Processed /DEFAULTLIB:libboost_regex-vc120-mt-sgd-1_55.libirgendwie automatisch ausgelöst.

Behoben durch manuelles Hinzufügen des nicht versionierten Dateinamens zu:

<AdditionalDependencies>$(DK_BOOST)\lib64\libboost_regex-mt-sgd.lib</AdditionalDependencies>

und die schwarze Liste der ...vc120-mt-sgd-1_55.libin

<IgnoreSpecificDefaultLibraries>libboost_regex-vc120-mt-sgd-1_55.lib</IgnoreSpecificDefaultLibraries>
Kevinf
quelle
0

b2 -j% Kerne% Toolset =% msvcver% Adressmodell = 64 Architektur = x86 Link = statisches Threading = Multi Runtime-Link = gemeinsam genutzt - Build-Typ = minimale Stufe --stagedir = Stufe / x64

Eigenschaften → Linker → Allgemein → Zusätzliche Bibliotheksverzeichnisse $ (BOOST) \ stage \ x64 \ lib

Dmitry Ivanov
quelle
Ein bisschen mehr Ausarbeitung darüber, was diese Zeilen tun und warum -> würde dazu beitragen, die Qualität dieser Antwort zu verbessern.
Anton Menshov