Cmake findet Boost nicht

85

Ich versuche, ein Projekt mit CMake zu konfigurieren, aber es findet keine Boost-Bibliotheken, obwohl sie sich im angegebenen Ordner befinden. Ich habe angegeben Boost_INCLUDE_DIR, Boost_LIBRARYDIRund BOOST_ROOT, aber ich erhalte immer noch eine Fehlermeldung, dass CMake Boost nicht finden kann. Was könnte der Grund für einen solchen Fehler sein?

Ivan Gromov
quelle
Einige Versionen von Boost verwenden die Flagge, Boost_INCLUDE_DIRandere die Flagge Boost_INCLUDEDIR( ohne Unterstrich ). Sie können die richtige für Ihren Fall überprüfen, indem Sie die FindBoost.cmakeDatei unterpath-to-cmake/Modules/FindBoost.cmake
marcelosalloum
Zu Ihrer Information, wenn Sie Boost mit CMake-Unterstützung aufbauen, sollten Siefind_package(Boost CONFIG)
Dmitry Sazonov

Antworten:

103

Bist du sicher, dass du es richtig machst? Die Idee ist , dass CMake - Sets BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRund BOOST_ROOTautomatisch. Machen Sie so etwas in CMakeLists.txt:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

Wenn Boost nicht an einem Standardspeicherort installiert ist und daher von CMake nicht gefunden werden kann, können Sie CMake mitteilen, wo nach Boost gesucht werden soll:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

Natürlich müssen diese beiden Zeilen vor dem FIND_PACKAGE(Boost)Eingang stehen CMakeLists.txt.

fschmitt
quelle
35
Es ist ${Boost_INCLUDE_DIR}nicht der ${BOOST_INCLUDE_DIR}Fall.
Ihor Kaharlichenko
3
Vielleicht hat sich dies in neueren Versionen von cmake geändert, aber hier sind die Referenzdokumente: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers
2
es funktioniert nicht für mich ... Es findet die Boost-Bibliothek, generiert aber Tonnen von Fehlern zur Kompilierungszeit
1
Sollte es nicht ' BOOST_INCLUDEDIR' sein?
Dmedine
2
@IhorKaharlichenko, aber BOOST_ROOT sollte BOOST_ROOT sein. wunderbar! Lassen Sie mich mit allen Fällen versuchen, Kamel Fall, alle Kappen, mit Unterstrichen, ohne Unterstriche ... <face-palm>
Duck Dodgers
52

Weitere Hilfe finden Sie, wenn Sie die FindBoost.cmakeDatei selbst lesen . Es befindet sich in Ihrem 'Module'-Verzeichnis.

Ein guter Anfang ist set(Boost_DEBUG 1)- dies wird eine Menge Informationen darüber ausspucken, wo Boost sucht, wonach es sucht, und kann helfen zu erklären, warum es ihn nicht finden kann.

Es kann Ihnen auch helfen, herauszufinden, ob es Ihre BOOST_ROOTrichtig aufnimmt.

FindBoost.cmakeManchmal treten auch Probleme auf, wenn die genaue Version von Boost nicht in den Variablen Verfügbare Versionen aufgeführt ist. Mehr dazu erfahren Sie beim Lesen FindBoost.cmake.

Zuletzt FindBoost.cmakehatte einige Fehler in der Vergangenheit. Eine Sache, die Sie versuchen könnten, ist, eine neuere Version von FindBoost.cmakeaus der neuesten Version von CMake zu nehmen und sie daneben in Ihren Projektordner zu stecken. CMakeLists.txtSelbst wenn Sie eine alte Version von Boost haben, wird die neue Version von FindBoost.cmakein verwendet den Ordner Ihres Projekts.

Viel Glück.

nicht hell
quelle
8

Ich hatte selbst eine Weile mit diesem Problem zu kämpfen. Es stellte sich heraus, dass cmakenach Boost-Bibliotheksdateien unter Verwendung der Namenskonvention von Boost gesucht wurde, bei der der Bibliotheksname eine Funktion der Compilerversion ist, mit der er erstellt wurde. Unsere Boost-Bibliotheken wurden mit erstellt GCC 4.9.1, und diese Compiler-Version war tatsächlich auf unserem System vorhanden. wurde aber GCC 4.4.7auch zufällig installiert. Zufällig erkannte das FindBoost.cmakeSkript von cmake die GCC 4.4.7Installation anstelle der Installation automatisch GCC 4.9.1und suchte daher nach Boost-Bibliotheksdateien mit " gcc44" in den Dateinamen anstelle von " gcc49".

Die einfache Lösung bestand darin, cmake zu zwingen, anzunehmen, dass GCC 4.9 vorhanden war, indem Boost_COMPILERauf " -gcc49" in gesetzt wurde CMakeLists.txt. Mit dieser Änderung wurden FindBoost.cmakemeine Boost-Bibliotheksdateien gesucht und gefunden.

Tom P.
quelle
6

Sie können auch die Version von Boost angeben, die CMake verwenden soll, indem Sie die Position der Boost-Header für die richtige Version übergeben -DBOOST_INCLUDEDIRoder -DBOOST_ROOTdarauf verweisen

Beispiel:

cmake -DBOOST_ROOT=/opt/latestboost

Dies ist auch nützlich, wenn sich mehrere Boost-Versionen auf demselben System befinden.

Skillachie
quelle
Danke, das hat bei mir mit Avro Build für Windows funktioniert.
Ggurov
5

Ich hatte auch ein ähnliches Problem und stellte fest, dass die Variablen BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR und BOOST_ROOT env absolute Pfade enthalten müssen. HTH!

Sphakka
quelle
Ja. Hatte das gleiche Problem wegen des relativen Pfades in der BOOST_ROOT-Umgebung. Vielen Dank an dich!
korst1k
2

Ich hatte das gleiche Problem beim Versuch, makeein Projekt auszuführen, nachdem ich Boost Version 1.66.0 unter Ubuntu Trusty64 installiert hatte. Die Fehlermeldung war ähnlich (nicht genau wie diese):

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

Boost wurde definitiv installiert, aber CMake konnte es nicht erkennen. Nachdem ich viel Zeit damit verbracht hatte, an Pfaden und Umgebungsvariablen zu basteln, überprüfte ich mich schließlich cmakeselbst nach Optionen und fand Folgendes:

--check-system-vars        = Find problems with variable usage in system files

Daher habe ich im fraglichen Verzeichnis Folgendes ausgeführt:

sudo cmake --check-system-vars

welches zurückkehrte:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

und löste das Problem.

user3006381
quelle
2

Wenn Sie Ihren eigenen Boost erstellen, vergessen Sie nicht, den zu verwenden, da --layout=versionedsonst die Suche nach einer bestimmten Version der Bibliothek fehlschlägt

Gaetano Mendola
quelle
1

Für cmake Version 3.1.0-rc2 holen boost 1.57angeben-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2Der Standardwert boost<=1.56.0ist wie unter Verwendung von-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++

Simon Allfrey
quelle
0

Noch ein Ratschlag für alle, die versuchen, CGAL mit statisch verknüpftem Boost zu erstellen . Es reicht nicht aus zu definieren Boost_USE_STATIC_LIBS; Es wird überschrieben, wenn die Zeit Boost_DEBUGseinen Wert ausgibt. Hier müssen Sie das Kontrollkästchen "Erweitert" aktivieren und aktivieren CGAL_Boost_USE_STATIC_LIBS.

Philip
quelle
-1

Vielleicht

brew install boost

wird dir helfen.

yayu
quelle