Saya memiliki masalah serupa, CMake hanya menemukan Boost yang diinstal vendor, tetapi klaster saya memiliki versi yang diinstal secara lokal yang I ingin itu digunakan. Red Hat Linux 6.
Pokoknya, sepertinya semua BOOSTROOT
, BOOST_ROOT
, dan Boost_DIR
hal-hal akan terganggu kecuali ada juga yang menyetel Boost_NO_BOOST_CMAKE
(misalnya tambahkan ke baris cmd -DBoost_NO_BOOST_CMAKE=TRUE
).
(Saya akan mengakui kegunaan CMake untuk multiplatform, tapi saya masih bisa membencinya.)
Saya akhirnya bisa mendapatkan apa yang saya inginkan
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
Versi singkat
Anda hanya membutuhkan BOOST_ROOT
, tetapi Anda ingin menonaktifkan pencarian sistem untuk Boost lokal Anda jika Anda memiliki beberapa instalasi atau kompilasi silang untuk iOS atau Android. Dalam hal ini tambahkan Boost_NO_SYSTEM_PATHS
disetel ke false.
set( BOOST_ROOT "" CACHE PATH "Boost library path" )
set( Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost" )
Biasanya ini diteruskan pada baris perintah CMake menggunakan sintaks -D<VAR>=value
.
Versi yang lebih panjang
Secara resmi, halaman FindBoost menyatakan bahwa variabel ini harus digunakan untuk 'mengisyaratkan' lokasi Boost.
Modul ini membaca petunjuk tentang lokasi pencarian dari variabel:
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)
Ini membuat mantra yang benar secara teori:
cmake -DBoost_NO_SYSTEM_PATHS=TRUE \
-DBOOST_ROOT=/path/to/boost-dir
Saat Anda mengompilasi dari sumber
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} )
Kemudian ketika Anda memanggil skrip ini, Anda harus menyertakan skrip boost.cmake (milik saya ada di subdirektori a), sertakan header, tunjukkan ketergantungan, dan tautkan pustaka.
include( boost )
include_directories( ${boost_INCLUDE_DIR} )
add_dependencies( MyProject boost )
target_link_libraries( MyProject
${Boost_LIBRARIES} )
Anda harus melihat FindBoost.cmake
skrip, yang menangani deteksi Peningkatan dan menyiapkan semua variabel Peningkatan. Biasanya berada di /usr/share/cmake-2.6/Modules/
. Di dalamnya, Anda akan menemukan dokumentasi. Misalnya:
# 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.
#
Berbeda dengan BOOST_ROOT, variabel yang Anda maksud sebenarnya adalah variabel yang diatur oleh modul FindBoost. Perhatikan bahwa Anda tidak perlu (dan mungkin juga tidak ingin) mengedit konfigurasi proyek CMake Anda untuk menyetel BOOST_ROOT. Sebagai gantinya, Anda harus menggunakan variabel lingkungan, mis. menelepon
# BOOST_ROOT=/usr/local/... ccmake .