wake-up-neo.com

CMake findet keine Boost-Bibliotheken

Ich versuche, ein CMake-Skript zum Kompilieren einer Boost-basierten Anwendung unter Windows zu verwenden. Die Header-Only-Bibliotheken funktionieren einwandfrei, aber CMake kann die Bibliotheken nicht finden (die folgenden Boost-Bibliotheken konnten nicht gefunden werden: boost_serialization ). Der relevante Teil des CMake-Skripts ist:

# Path where CMake can find additional libraries
SET(CMAKE_PREFIX_PATH Libs)

# Boost
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
SET(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED COMPONENTS serialization)

Ich habe einen Ordner namens "Libs" in meinem Projekt, in dem Bibliotheken von Drittanbietern wie DevIL und Boost gespeichert sind. Es funktioniert gut für Devil and Boost-Header-only-Sachen, also gehe ich davon aus, dass ich die BOOST_ROOT-Variable nicht brauchen sollte. Die Boost-Installation ist die Standard-Quelldistribution von boost.org, die ich mit BJam kompiliert habe. Die Bibliotheken sind in boost_1_47_0\bin.v2\libs gespeichert, und ich habe am Erstellungsprozess nichts geändert.

Ich finde es etwas seltsam, dass der boost_1_47_0\libs-Ordner keine Bibliotheksdateien enthält, sondern BJam-Dateien und anderes Zeug, aber das sollte kein Problem sein, da dies der normale Weg ist, Boost unter Windows aus dem Quellcode zu erstellen .

Ich habe mir die Debug-Ausgabe aus der FindBoost.cmake-Datei angesehen (ich verwende das Standardskript von CMake 2.8) und es scheint nicht in bin.v2 zu suchen. Stattdessen wird nach boost_ROOT/lib gesucht, aber als ich den Inhalt von bin.v2\libs nach lib kopierte, fand er immer noch nichts.

Was ist also ein eleganter Weg, um Boost zu finden, der auch auf anderen Plattformen mit gängigen Boost-Distributionen funktioniert?

17
JonathanK

Nun, ich habe das Problem gelöst, bin aber mit meiner Lösung nicht zufrieden.

Meines Erachtens bestand das Problem darin, dass BJam eine zu komplexe Ordnerstruktur erstellt. Jetzt habe ich gerade die Bibliotheksdateien von "boost_1_47_0\bin.v2\libs\serialization\build\msvc-9.0\debug\link-static\threading-multi" nach "boost_1_47_0\lib" kopiert.

Ich muss das von Hand tun, aber ich verwende nicht so viele Boost-Bibliotheken, daher ist dieser Schritt meiner Meinung nach in Ordnung. Ich werde meine Lösung neben dem CMake-Skript dokumentieren, sodass andere Benutzer damit zurechtkommen sollten.

6
JonathanK

Ich würde versuchen, BOOST_ROOT in Ihrer CMakeLists.txt-Datei einzustellen. Ich weiß, dass CMake 2.8.6 Boost 1.47.0 findet, wenn Sie die Variable Boost_ADDITIONAL_VERSIONS setzen, da es für mich unter Windows funktioniert, wenn ich BOOST_ROOT gesetzt habe.

Folgendes habe ich in einem Projekt:

 
 gesetzt (BOOST_COMPONENTS_NEEDED-Serialisierung) 
 
 # Folgendes überprüft, ob BOOST_ROOT richtig eingestellt ist. 
 if (NICHT BOOST_ROOT UND NICHT $ ENV {BOOST_ROOT.) } STREQUAL "") 
 DATEI (TO_CMAKE_PATH $ ENV {BOOST_ROOT} BOOST_ROOT) 
 Wenn (NICHT EXISTS $ {BOOST_ROOT}) 
 MESSAGE (STATUS $ {BOOST_ROOT} "nicht vorhanden ist Überprüfen, ob BOOST_ROOT eine zitierte Zeichenfolge war. ") 
 STRING (REPLACE"\"" "" "BOOST_ROOT $ {BOOST_ROOT}) 
 If (EXISTS $ {BOOST_ROOT}) 
 MESSAGE (STATUS "Nach dem Entfernen der Anführungszeichen wurde" $ {BOOST_ROOT} "nun von CMake gefunden") 
 Endif (EXISTS $ {BOOST_ROOT}) 
 Endif (NICHT EXISTS $ {BOOST_ROOT}) 
 
 # Speichern Sie das BOOST_ROOT im Cache 
, Wenn (NICHT EXISTS $ {BOOST_ROOT}) 
 MESSAGE (WARNING $ {BOOST_ROOT} "nicht vorhanden ist.") 
 else (NICHT EXISTS $ {BOOST_ROOT}) 
 SET (BOOST_ROOT $ {BOOST_ROOT} CACHE STRING "Setzen Sie den Wert von BOOST_ROOT so, dass er auf den Stammordner Ihrer Boost-Installation verweist." FORCE) 
 #SET (BOOST_INCLUDEDIR $ {BOOST_ROOT}/Include) 
 # SET (BOOST_LIBRARYDIR $ {BOOST_ROOT}/lib) 
 Endif (NICHT EXISTS $ {BOOST_ROOT}) 
 
 Endif (NICHT BOOST_ROOT UND NICHT $ ENV {BOOST_ROOT} STREQUAL "")) .____.] 
 if (WIN32 UND NICHT BOOST_ROOT) 
 MESSAGE (WARNUNG "Bitte setzen Sie die Umgebungsvariable BOOST_ROOT.") 
 endif (WIN32 UND NICHT BOOST_ROOT) 
 
 gesetzt (Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
 gesetzt (Boost_DEBUG ON) 
 gesetzt (Boost_USE_STATIC_LIBS OFF) 
 gesetzt (Boost_USE_MULTITHREADED ON) 
 gesetzt (Boost_USE_STATIC_RUNTIME OFF) 
 FIND_PACKAGE (Boost 1.47.0 KOMPONENTEN $ {BOOST_COMPONENTS_NEEDED}) 
 if (Boost_FOUND) 
 MESSAGE (STATUS "Einrichten des Boost.") 
 include_directories ($ {Boost_I NCLUDE_DIRS}) 
 If (Boost_DEBUG) 
 MESSAGE (STATUS "BOOST Libraries" $ {Boost_LIBRARIES}) 
 FOREACH (BOOST_COMPONENT $ {BOOST_COMPONENTS_NEEDED}) 
 STRING (TOUPP.) $ {BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
 MESSAGE (STATUS "Boost" $ {BOOST_COMPONENT} ":" $ {Boost _ $ {BOOST_COMPONENT_UPCASE} _LIBRARY}) 
 MESSAGE (STATUS ")". DebugAchn.-Kanal: "$ {Boost _ $ {BOOST_COMPONENT_UPCASE} _LIBRARY_DEBUG}) 
 MESSAGE (STATUS" Boost "$ {BOOST_COMPONENT}") Release: "$ {Boost _ $ {BOOST_COMPONENT_UPCASE} _LIBRARY_RELEIrach) ) 
 endif (Boost_DEBUG) 
 endif (Boost_FOUND) 
 
14
drescherjm

Ich kam mit einem ähnlichen Problem hierher und wollte nur sagen, dass mein Fix ähnlich war, aber nicht genau das gleiche.

Mein Installationspräfix war C:\lib\boost\boost_1_57_0. Ich habe eine BOOST_ROOT-Umgebungsvariable gesetzt, die auf dieses Verzeichnis verweist, aber CMake (3.1.0) konnte die Header immer noch nicht finden. Mir wurde klar, dass die Header standardmäßig C:\lib\boost\boost_1_57_0\include\boost-1_57\boost installiert wurden. Ich werde nicht mehrere Versionen ausführen, also habe ich das letzte Boost-Verzeichnis nach unten verschoben, das boost-1_57-Verzeichnis entfernt und die Kopfzeilen hier beendet:

C:\lib\boost\boost_1_57_0\include\boost

Und CMake hat alles gefunden.

0
Chuck Claunch

Ich hatte vorher ein Problem damit. Aus irgendeinem Grund hat b2 (alias BJam) die Boost-Bibliotheken mit einer führenden "lib" erstellt.

Das CMake-Skript sucht nicht nach einer Datei mit dem Namen libboost_thread.lib. Es findet nur boost_thread.lib. Entfernen Sie den führenden lib und CMake sollte sie finden.

0
deft_code