it-swarm.com.de

Wie kann ich CMake dazu bringen, meine alternative Boost-Installation zu finden?

Ich habe die neueste Version von Boost in /usr/local installiert (mit Includes in /usr/local/include/boost und Bibliotheken in /usr/local/lib/boost). Ich versuche jetzt, Wt von der Quelle zu installieren, aber CMake (Version 2.6) scheint die Boost-Installation nicht zu finden. Es wird versucht, hilfreiche Vorschläge zum Setzen von BOOST_DIR und Boost_LIBRARYDIR zu geben, aber ich konnte es nicht schaffen, diese Variablen zu optimieren.

Die aktuellste Fehlermeldung, die ich bekomme, ist, dass die Bibliotheken nicht gefunden werden können. Es scheint jedoch zu sein, dass sie/usr/local/include für den Include-Pfad verwendet, was nicht korrekt ist (und ich kann ' scheint es zu beheben). Gibt es dafür eine Lösung für sie, oder muss ich in CMake herumtollen, um das herauszufinden?

45
BD at Rivenhill

Nachdem ich in CMake herumgegraben und experimentiert hatte, stellte ich fest, dass CMake unzufrieden mit der Tatsache war, dass alle meine Boost-Bibliotheken in /usr/local/lib/boost und nicht in /usr/local/lib enthalten waren. Sobald ich sie wieder weich verbunden hatte, funktionierte der Build.

3
BD at Rivenhill

Sie sollten sich das FindBoost.cmake-Skript ansehen, das die Boost-Erkennung übernimmt und alle Boost-Variablen einrichtet. Sie befindet sich normalerweise in /usr/share/cmake-2.6/Modules/. Darin finden Sie Dokumentation. Zum Beispiel:

# These last three variables are available also as environment variables:
#
#   BOOST_ROOT or BOOSTROOT      The preferred installation prefix for searching for
#                                Boost.  Set this if the module has problems finding
#                                the proper Boost installation.
#

Im Gegensatz zu BOOST_ROOT sind die Variablen, auf die Sie sich beziehen, tatsächlich Variablen, die vom FindBoost-Modul festgelegt werden. Beachten Sie, dass Sie Ihre CMake-Projektkonfiguration nicht ändern müssen (und dies wahrscheinlich auch nicht möchten), um BOOST_ROOT festzulegen. Verwenden Sie stattdessen die Umgebungsvariable, z. Berufung

# BOOST_ROOT=/usr/local/... ccmake .

35
ypnos

Ich konnte endlich das bekommen, was ich wollte

cmake -DCMAKE_INSTALL_PREFIX=$TARGET \
    -DBoost_NO_BOOST_CMAKE=TRUE \
    -DBoost_NO_SYSTEM_PATHS=TRUE \
    -DBOOST_ROOT:PATHNAME=$TARGET \
    -DBoost_LIBRARY_DIRS:FILEPATH=${TARGET}/lib
33
Damien Kick

Die kurze Version

Sie brauchen nur BOOST_ROOT, aber Sie sollten die Suche des Systems nach Ihrem lokalen Boost deaktivieren, wenn Sie mehrere Installationen haben oder für iOS oder Android cross-compiling sind. In diesem Fall ist add Boost_NO_SYSTEM_PATHS auf false gesetzt.

set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )

Normalerweise wird dies in der CMake-Befehlszeile mit der Syntax -D<VAR>=value übergeben.

Die längere Version

Offiziell heißt die Seite FindBoost , dass diese Variablen verwendet werden sollten, um die Position von Boost anzuzeigen.

Dieses Modul liest Hinweise zu Suchorten aus Variablen:

BOOST_ROOT             - Preferred installation prefix
 (or BOOSTROOT)
BOOST_INCLUDEDIR       - Preferred include directory e.g. <prefix>/include
BOOST_LIBRARYDIR       - Preferred library directory e.g. <prefix>/lib
Boost_NO_SYSTEM_PATHS  - Set to ON to disable searching in locations not
                         specified by these hint variables. Default is OFF.
Boost_ADDITIONAL_VERSIONS
                       - List of Boost versions not known to this module
                         (Boost install locations may contain the version)

Dies macht eine theoretisch korrekte Beschwörung:

cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
      -DBOOST_ROOT=/path/to/boost-dir

Wenn Sie aus der Quelle kompilieren

include( ExternalProject )

set( boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2" )
set( boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6" )
set( boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost )
set( boost_INCLUDE_DIR ${boost_INSTALL}/include )
set( boost_LIB_DIR ${boost_INSTALL}/lib )

ExternalProject_Add( boost
        PREFIX boost
        URL ${boost_URL}
        URL_HASH SHA1=${boost_SHA1}
        BUILD_IN_SOURCE 1
        CONFIGURE_COMMAND
        ./bootstrap.sh
        --with-libraries=filesystem
        --with-libraries=system
        --with-libraries=date_time
        --prefix=<INSTALL_DIR>
        BUILD_COMMAND
        ./b2 install link=static variant=release threading=multi runtime-link=static
        INSTALL_COMMAND ""
        INSTALL_DIR ${boost_INSTALL} )

set( Boost_LIBRARIES
        ${boost_LIB_DIR}/libboost_filesystem.a
        ${boost_LIB_DIR}/libboost_system.a
        ${boost_LIB_DIR}/libboost_date_time.a )
message( STATUS "Boost static libs: " ${Boost_LIBRARIES} )

Wenn Sie dieses Skript aufrufen, müssen Sie dann das Skript boost.cmake einfügen (meins befindet sich im Unterverzeichnis a), die Kopfzeilen einfügen, die Abhängigkeit angeben und die Bibliotheken verknüpfen.

include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
                       ${Boost_LIBRARIES} )
15

Im Allgemeinen ist der häufigste Fehler das Build-Verzeichnis wird nicht bereinigt , nachdem neue Optionen hinzugefügt wurden. Ich habe Boost vom Systempaketmanager installiert. Seine Version ist 1.49.

Ich habe auch Boost 1.53 heruntergeladen und unter $HOME/installs "installiert".

Das einzige, was ich in meinem Projekt tun musste, war (Quellen in my_project_directory/src zu speichern):

cd my_project_directory
mkdir build
cd build
cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src

Und das ist es. Ta bum tss.

Aber wenn ich nach cd build -> cmake ../src machen würde, würde das Boost aus dem Systempfad setzen. Dann würde cmake -DCMAKE_INCLUDE_PATH=$HOME/installs/include -DCMAKE_LIBRARY_PATH=$HOME/installs/lib ../src nichts ändern.

Du musst dein Build-Verzeichnis bereinigen (cd build && rm -rf *;))

12
jaor

Ich hatte ein ähnliches Problem, CMake fand nur einen vom Hersteller installierten Boost, aber mein Cluster hatte eine lokal installierte Version, die vonIverwendet werden sollte. Red Hat Linux 6.

Jedenfalls sieht es so aus, als würden alle BOOSTROOT-, BOOST_ROOT- und Boost_DIR-Sachen ärgerlich sein, es sei denn, man setzt auch Boost_NO_BOOST_CMAKE (z. B. add to cmd line -DBoost_NO_BOOST_CMAKE=TRUE).

(Ich werde die Nützlichkeit von CMake für Multiplattform anerkennen, aber ich kann es immer noch hassen.)

12
user1795638

Es gibt eine generische Methode, um CMake Anweisungen zum Auffinden von Bibliotheken zu geben.

Bei der Suche nach einer Bibliothek sucht CMake zuerst die folgenden Variablen:

  • CMAKE_LIBRARY_PATH und LD_LIBRARY_PATH für Bibliotheken
  • CMAKE_INCLUDE_PATH und INCLUDE_PATH für Includes

Wenn Sie Ihre Boost-Dateien in einer der Umgebungsvariablen deklarieren, wird sie von CMake gefunden. Beispiel:

export CMAKE_LIBRARY_PATH="/stuff/lib.boost.1.52/lib:$CMAKE_LIBRARY_PATH"
export CMAKE_INCLUDE_PATH="/stuff/lib.boost.1.52/include:$CMAKE_INCLUDE_PATH"

Wenn es zu umständlich ist, können Sie auch ein Nice-Installationstool verwenden, das ich geschrieben habe und das alles für Sie tun wird: C++ - Versionsmanager

11
Offirmo

Ich hatte ein ähnliches Problem, und ich konnte angepasste Boost-Bibliotheken verwenden, indem ich die folgenden Zeilen meiner CMakeLists.txt-Datei hinzufügte:

set(Boost_NO_SYSTEM_PATHS TRUE)
if (Boost_NO_SYSTEM_PATHS)
  set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../3p/boost")
  set(BOOST_INCLUDE_DIRS "${BOOST_ROOT}/include")
  set(BOOST_LIBRARY_DIRS "${BOOST_ROOT}/lib")
endif (Boost_NO_SYSTEM_PATHS)
find_package(Boost REQUIRED regex date_time system filesystem thread graph program_options)
include_directories(${BOOST_INCLUDE_DIRS})
9
hungptit

Ich habe den größten Teil meines Abends damit verbracht, das zum Laufen zu bringen. Ich habe alle -DBOOST_ * & c ausprobiert. Direktiven mit CMake, aber die Verbindung zu meinen System-Boost-Bibliotheken blieb bestehen, auch nachdem ich meinen Build-Bereich wiederholt geleert und neu konfiguriert hatte.

Am Ende habe ich das generierte Makefile geändert und das Ziel cmake_check_build_system für ungültig erklärt, um nichts zu tun (wie 'echo ""), damit es meine Änderungen beim Ausführen von make nicht überschreibt, und habe dann' grep -rl "lboost_python" * | xargs sed -i "s: -lboost_python: -L/opt/sw/gcc5/usr/lib/-lboost_python: g 'in meinem build/-Verzeichnis, um alle build-Befehle explizit auf die Boost-Installation zu verweisen, die ich verwenden wollte , das hat funktioniert.

Ich gebe zu, dass es ein hässlicher Kludge ist, aber ich lege es hier nur zum Wohle derer aus, die auf die gleiche Mauer stoßen und einfach nur daran arbeiten und die Arbeit erledigen wollen.

1
Doug S.

Ich bin auch auf das gleiche Problem gestoßen, aber es hat nicht geholfen, die Hinweise hier zu probieren.

Das einzige, was geholfen hat, war, die neueste Version von der Boost-Seite herunterzuladen, zu kompilieren und als In Installation von Boost 1.50 unter Ubuntu 12.10 zu installieren.

In meinem Fall habe ich mit Boost 1.53 gearbeitet.

1
Samsky

Während configure meine Boost-Installation finden konnte, konnte CMake dies nicht tun.

Suchen Sie nach FindBoost.cmake und suchen Sie nach LIBRARY_HINTS, um zu sehen, nach welchen Unterpaketen es sucht. In meinem Fall wollte es die MPI - und Graph-Bibliotheken.

 # Compute component-specific hints.
  set(_Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT "")
  if(${COMPONENT} STREQUAL "mpi" OR ${COMPONENT} STREQUAL "mpi_python" OR
     ${COMPONENT} STREQUAL "graph_parallel")
    foreach(lib ${MPI_CXX_LIBRARIES} ${MPI_C_LIBRARIES})
      if(IS_ABSOLUTE "${lib}")
        get_filename_component(libdir "${lib}" PATH)
        string(REPLACE "\\" "/" libdir "${libdir}")
        list(APPEND _Boost_FIND_LIBRARY_HINTS_FOR_COMPONENT ${libdir})
      endif()
    endforeach()
  endif()

apt-cache search ... Ich habe die dev-Pakete installiert, seit ich Code erstellt habe, und das dev-Paket zieht alle Abhängigkeiten mit sich. Ich bin nicht so sicher, dass eine Standard-Boost-Installation Open MPI benötigt, dies ist jedoch in Ordnung.

Sudo apt-get install libboost-mpi-dev libboost-mpi-python-dev
Sudo apt-get install libboost-graph-parallel-dev
0
rickfoosusa

Ich bin auf einem Linux-Server auf ein ähnliches Problem gestoßen, auf dem zwei Boost-Versionen installiert wurden. Eine ist die vorkompilierte Version 1.53.0, die 2018 als alt gilt; es ist in /usr/include und /usr/lib64. Die Version, die ich verwenden möchte, ist 1.67.0, da eine Mindestversion von 1.65.1 für eine andere C++ - Bibliothek erforderlich ist, die ich installiere. Es ist in /opt/boost, das Unterverzeichnisse include und lib hat. Wie in den vorherigen Antworten vorgeschlagen, setze ich Variablen in CMakeLists.txt, um anzugeben, wo Boost 1.67.0 wie folgt gesucht werden soll

include_directories(/opt/boost/include/)
include_directories(/opt/boost/lib/)
set(BOOST_ROOT /opt/boost/)
set(BOOST_INCLUDEDIR /opt/boost/include/)
set(BOOST_LIBRARYDIR /opt/boost/lib)
set(Boost_NO_SYSTEM_PATHS TRUE)
set(Boost_NO_BOOST_CMAKE TRUE)

CMake respektiert diese Änderungen jedoch nicht. Dann fand ich online einen Artikel: CMake kann einen lokalen Boost verwenden, und mir wurde klar, dass ich die Variablen in CMakeCache.txt ändern muss. Dort habe ich festgestellt, dass die mit Boost zusammenhängenden Variablen immer noch auf den Standard-Boost 1.53.0 verweisen, sodass CMake meine Änderungen in CMakeLists.txt nicht berücksichtigt. Dann setze ich die Boost-bezogenen Variablen in CMakeCache.txt

Boost_DIR:PATH=Boost_DIR-NOTFOUND
Boost_INCLUDE_DIR:PATH=/opt/boost/include/
Boost_LIBRARY_DIR_DEBUG:PATH=/opt/boost/lib
Boost_LIBRARY_DIR_RELEASE:PATH=/opt/boost/lib

Ich habe auch die Variablen geändert, die auf Nicht-Header verweisen, kompilierte Teile der Boost-Bibliothek, um auf die gewünschte Version zu verweisen. Dann hat CMake die Bibliothek erfolgreich erstellt, die von einer aktuellen Boost-Version abhängig ist.

0
Lambda Moses