GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu přimět CMake, aby našel svou alternativní instalaci Boost?

Měl jsem podobný problém, CMake našel pouze Boost nainstalovaný dodavatelem, ale můj cluster měl lokálně nainstalovanou verzi, což chtěl to použít. Red Hat Linux 6.

Každopádně to vypadá jako všechny BOOSTROOT , BOOST_ROOT a Boost_DIR věci by se rozčilovaly, pokud by člověk nenastavil také Boost_NO_BOOST_CMAKE (např. přidejte na řádek cmd -DBoost_NO_BOOST_CMAKE=TRUE ).

(Připouštím užitečnost CMake pro multiplatformní systémy, ale stále ho mohu nenávidět.)


Konečně jsem mohl získat to, co jsem chtěl s

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

Krátká verze

Potřebujete pouze BOOST_ROOT , ale pokud máte více instalací nebo křížovou kompilaci pro iOS nebo Android, budete chtít zakázat vyhledávání v systému pro místní Boost. V takovém případě přidejte Boost_NO_SYSTEM_PATHS je nastaveno na hodnotu false.

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

Normálně se to předává na příkazovém řádku CMake pomocí syntaxe -D<VAR>=value .

Delší verze

Oficiálně řečeno, stránka FindBoost uvádí, že tyto proměnné by měly být použity k „nápovědě“ umístění Boostu.

Tento modul čte rady ohledně hledání umístění z proměnných:

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)

To dělá teoreticky správné zaklínadlo:

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

Když kompilujete ze zdroje

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

Když pak zavoláte tento skript, budete muset zahrnout skript boost.cmake (můj je v podadresáři a), zahrnout záhlaví, označit závislost a propojit knihovny.

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

Měli byste se podívat na FindBoost.cmake skript, který se stará o detekci Boost a nastavení všech proměnných Boost. Obvykle se nachází v /usr/share/cmake-2.6/Modules/ . V něm najdete dokumentaci. Například:

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

Na rozdíl od BOOST_ROOT jsou proměnné, na které odkazujete, ve skutečnosti proměnné, které nastavuje modul FindBoost. Všimněte si, že pro nastavení BOOST_ROOT nemusíte (a pravděpodobně ani nechcete) upravovat konfiguraci projektu CMake. Místo toho byste měli použít proměnnou prostředí, např. volání

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


Linux
  1. Jak mohu vypočítat kontrolní součet md5 adresáře?

  2. Jak mohu dosáhnout toho, aby příkaz `najít` ignoroval adresáře .svn?

  3. Jak mohu získat stav klávesnice v Linuxu?

  1. Jak mohu vytvořit soubor v každé složce?

  2. Jak mohu spustit dos2unix v celém adresáři?

  3. Jak najdu svou verzi shellu pomocí příkazu Linux?

  1. Jak najdu všechny pevné odkazy na souborovém systému?

  2. Jak mohu najít nejstarší soubor ve stromu adresářů

  3. Jak mohu získat binární soubor ze souboru .py