GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Ich hatte ein ähnliches Problem, CMake fand nur einen vom Anbieter installierten Boost, aber mein Cluster hatte eine lokal installierte Version, was ich ist wollte es verwenden. Red Hat Linux 6.

Wie auch immer, es sieht aus wie alle BOOSTROOT , BOOST_ROOT , und Boost_DIR Sachen würden sich ärgern, wenn man nicht auch Boost_NO_BOOST_CMAKE setzt (z. B. zur Befehlszeile -DBoost_NO_BOOST_CMAKE=TRUE hinzufügen ).

(Ich gebe die Nützlichkeit von CMake für mehrere Plattformen zu, aber ich kann es immer noch hassen.)


Mit

konnte ich endlich 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

Die Kurzversion

Sie brauchen nur BOOST_ROOT , aber Sie sollten das Durchsuchen des Systems nach Ihrem lokalen Boost deaktivieren, wenn Sie mehrere Installationen oder Cross-Compiling für iOS oder Android haben. Fügen Sie in diesem Fall Boost_NO_SYSTEM_PATHS hinzu auf false gesetzt ist.

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 auf der CMake-Befehlszeile mit der Syntax -D<VAR>=value übergeben .

Die längere Version

Offiziell heißt es auf der FindBoost-Seite, dass diese Variablen verwendet werden sollten, um den Standort von Boost anzuzeigen.

Dieses Modul liest Hinweise zu Suchpositionen 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 ergibt eine theoretisch korrekte Beschwörung:

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

Wenn Sie aus dem Quellcode 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 dann dieses Skript aufrufen, müssen Sie das Skript boost.cmake einbinden (meins befindet sich im Unterverzeichnis a), die Header einschließen, die Abhängigkeit angeben und die Bibliotheken verlinken.

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

Sie sollten sich FindBoost.cmake ansehen -Skript, das die Boost-Erkennung und die Einrichtung aller Boost-Variablen übernimmt. Es befindet sich normalerweise in /usr/share/cmake-2.6/Modules/ . Darin finden Sie eine 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 handelt es sich bei den Variablen, auf die Sie sich beziehen, tatsächlich um Variablen, die vom FindBoost-Modul festgelegt werden. Beachten Sie, dass Sie Ihre CMake-Projektkonfiguration nicht bearbeiten müssen (und wahrscheinlich auch nicht wollen), um BOOST_ROOT festzulegen. Stattdessen sollten Sie die Umgebungsvariable verwenden, z. anrufen

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


Linux
  1. Wie setze ich einen optionalen Parameter?

  2. Wie kann ich `find` dazu bringen, .svn-Verzeichnisse zu ignorieren?

  3. Wie kann ich den Tastaturstatus unter Linux abrufen?

  4. Wie kann ich das 'Backend' in Matplotlib in Python einstellen?

  5. Wie kann ich in jedem Ordner eine Datei erstellen?

So finden / erhalten Sie Ihre IP-Adresse unter Linux

So finden Sie das Installationsdatum und die Uhrzeit des Linux-Betriebssystems

Wie erhalte ich eine sichere systemweite oh-my-zsh-Konfiguration?

Wie finde ich verfügbare Netzwerkschnittstellen?

Wie kann ich eine Linux-Installation von HDD auf SSD migrieren?

Wie kann ich eine Binärdatei aus einer .py-Datei erhalten?