GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso fare in modo che CMake trovi la mia installazione Boost alternativa?

Ho avuto un problema simile, CMake ha trovato solo un Boost installato dal fornitore, ma il mio cluster aveva una versione installata localmente che è ciò che io voleva usarlo. Red Hat Linux 6.

Ad ogni modo, sembra tutto il BOOSTROOT , BOOST_ROOT e Boost_DIR le cose si infastidirebbero a meno che non si imposti anche Boost_NO_BOOST_CMAKE (ad es. aggiungi alla riga cmd -DBoost_NO_BOOST_CMAKE=TRUE ).

(Concederò l'utilità di CMake per la multipiattaforma, ma posso ancora odiarlo.)


Finalmente sono riuscito a ottenere quello che volevo

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

La versione breve

Hai solo bisogno di BOOST_ROOT , ma vorrai disabilitare la ricerca nel sistema per il tuo Boost locale se hai più installazioni o compilazione incrociata per iOS o Android. In tal caso aggiungi Boost_NO_SYSTEM_PATHS è impostato su false.

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

Normalmente questo viene passato sulla riga di comando di CMake utilizzando la sintassi -D<VAR>=value .

La versione più lunga

Ufficialmente la pagina FindBoost afferma che queste variabili dovrebbero essere utilizzate per "suggerire" la posizione di Boost.

Questo modulo legge suggerimenti sulle posizioni di ricerca dalle variabili:

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)

Questo fa un incantesimo teoricamente corretto:

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

Quando compili dal sorgente

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} )

Quindi quando chiami questo script dovrai includere lo script boost.cmake (il mio è nella sottodirectory a), includere le intestazioni, indicare la dipendenza e collegare le librerie.

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

Dovresti dare un'occhiata a FindBoost.cmake script, che gestisce il rilevamento Boost e l'impostazione di tutte le variabili Boost. Solitamente risiede in /usr/share/cmake-2.6/Modules/ . In esso troverai la documentazione. Ad esempio:

# 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.
#

A differenza di BOOST_ROOT, le variabili a cui ti riferisci sono in realtà variabili impostate dal modulo FindBoost. Nota che non devi (e probabilmente non vuoi) modificare la configurazione del tuo progetto CMake per impostare BOOST_ROOT. Invece, dovresti usare la variabile d'ambiente, ad es. chiamata

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


Linux
  1. Come posso calcolare un checksum md5 di una directory?

  2. Come posso convertire gli spazi in schede in Vim o Linux?

  3. Come posso ottenere una configurazione oh-my-zsh sicura a livello di sistema?

  4. Come posso trovare tutti i file hardlink su un filesystem?

  5. Come posso trovare il file più vecchio in un albero di directory

Come trovare/ottenere il tuo indirizzo IP in Linux

Come trovare la data e l'ora di installazione del sistema operativo Linux

Come posso eseguire dos2unix su un'intera directory?

Come posso ottenere valori univoci da un array in Bash?

Come posso trovare la mia versione della shell usando un comando Linux?

Come posso ottenere un binario da un file .py