2010-09-28 15 views
58

Sto tentando di configurare un progetto utilizzando CMake, ma non riesce a trovare le librerie Boost anche se si trovano nella cartella specificata. Ho specificato Boost_INCLUDE_DIR, Boost_LIBRARYDIR e BOOST_ROOT, ma ricevo comunque un errore che dice che CMake non è in grado di trovare Boost. Quale potrebbe essere la ragione di tale errore?Cmake non trova Boost

risposta

81

Sei sicuro di farlo nel modo corretto? L'idea è che CMake imposta automaticamente BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR e BOOST_ROOT. Fare qualcosa di simile in CMakeLists.txt:

FIND_PACKAGE(Boost) 
IF (Boost_FOUND) 
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) 
    ADD_DEFINITIONS("-DHAS_BOOST") 
ENDIF() 

se spinta non è installato in una posizione predefinita e non può quindi essere trovato da CMake, si può dire CMake dove cercare spinta in questo modo:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost") 
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib") 

ovviamente quelle due linee devono essere prima il FIND_PACKAGE (Boost) in CMakeLists.txt

+26

È '$ {Boost_INCLUDE_DIR}' non '$ {BOOST_INCLUDE_DIR}', il caso è importante. –

+2

Forse questo è cambiato nelle versioni più recenti di cmake, ma ecco i documenti di riferimento: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html –

+2

non funziona per me ... trova la libreria boost, ma genera tonnellate di errori al momento della compilazione –

37

Non v'è più aiuto disponibile leggendo il file FindBoost.cmake stesso. Si trova nella directory 'Modules'.

Un buon inizio è impostare (Boost_DEBUG 1) - questo sputerà una buona quantità di informazioni su dove sta cercando l'amplificazione, cosa sta cercando e potrebbe aiutare a spiegare perché non riesce a trovarlo.

Può anche aiutarti a capire se sta riprendendo correttamente il tuo BOOST_ROOT.

FindBoost.cmake a volte ha anche problemi se la versione esatta di boost non è elencata nelle variabili Versioni disponibili. Puoi trovare maggiori informazioni leggendo FindBoost.cmake

Infine, FindBoost.cmake ha avuto alcuni bug in passato. Una cosa che potresti provare è di prendere una versione più recente di FindBoost.cmake dall'ultima versione di cmake, e inserirla nella cartella del tuo progetto insieme a CMakeLists.txt - quindi, anche se hai una vecchia versione di boost, userà il nuova versione di FindBoost.cmake che si trova nella cartella del progetto.

Buona fortuna.

0

Un altro piccolo consiglio per chiunque stia cercando di costruire CGAL in particolare, con Boost collegato staticamente. Non è sufficiente definire Boost_USE_STATIC_LIBS; viene sovrascritto dal momento in cui Boost_DEBUG emette il suo valore. La cosa da fare qui è controllare la casella di controllo "Avanzate" e abilitare CGAL_Boost_USE_STATIC_LIBS.

2

Se state costruendo la propria spinta non dimenticare di usare il --layout = versioned altrimenti la ricerca di una particolare versione di libreria fallirà

3

Ho anche avuto un problema simile e ha scoperto che il BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR e le variabili env BOOST_ROOT devono contenere i percorsi assoluti. HTH!

1

Per la versione 3.1.0 cmake-RC2 per raccogliere spinta 1,57 specificare -D_boost_TEST_VERSIONS = 1.57

versione cmake default 3.1.0-RC2 per aumentare < = 1.56.0 come si vede utilizzando -DBoost_DEBUG = ON

cmake -D_boost_TEST_VERSIONS = 1.57 -DBoost_DEBUG = ON -DCMAKE_BUILD_TYPE = Debug -DCMAKE_C_COMPILER = clang -DCMAKE_CXX_COMPILER = clang ++

7

Ho sofferto per un po 'di tempo con questo problema. Si è scoperto che cmake stava cercando i file della libreria Boost utilizzando la convenzione di denominazione di Boost, in cui il nome della libreria è una funzione della versione del compilatore utilizzata per crearlo. Le nostre librerie Boost sono state costruite usando GCC 4.9.1 e quella versione del compilatore era presente sul nostro sistema; tuttavia, è stato installato anche GCC 4.4.7. Come accade, lo script FindBoost.cmake di cmake stava rilevando automaticamente l'installazione GCC 4.4.7 anziché quella GCC 4.9.1, quindi cercava i file di libreria Boost con "gcc44" nei nomi file, anziché "gcc49".

La semplice correzione era di forzare cmake ad assumere che GCC 4.9 fosse presente, impostando Boost_COMPILER su "-gcc49" in CMakeLists.txt. Con questa modifica, FindBoost.cmake ha cercato e trovato i file della mia libreria Boost.

1

È inoltre possibile specificare la versione del Boost che si desidera CMake da usare passando -DBOOST_INCLUDEDIR o -DBOOST_ROOT che punta alla posizione di corretta versione intestazioni spinta

Esempio:

cmake -DBOOST_ROOT=/opt/latestboost

Ciò sarà utile anche quando più versioni di boost si trovano sullo stesso sistema.

0

Ho avuto lo stesso problema durante il tentativo di eseguire make per un progetto dopo aver installato la versione di potenziamento 1.66.0 su Ubuntu Trusty64. Il messaggio di errore è stato simile a (non esattamente) questo:

CMake Error at  
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message): 
Unable to find the requested Boost libraries. 
Boost version: 0.0.0 
Boost include path: /usr/include 
Detected version of Boost is too old. Requested version was 1.36 (or newer). 
Call Stack (most recent call first): 
CMakeLists.txt:10 (FIND_PACKAGE) 

Boost è stato definitivamente installato, ma CMake non poteva rilevarla. Dopo aver trascorso un sacco di tempo ad armeggiare con i percorsi e le variabili ambientali, alla fine ho finito per il controllo cmake sé per le opzioni e trovato il seguente:

--check-system-vars  = Find problems with variable usage in system files 

così mi sono imbattuto il seguente nella directory in questione:

sudo cmake --check-system-vars

che ha restituito:

Also check system files when warning about unused and uninitialized variables. 
-- Boost version: 1.66.0 
-- Found the following Boost libraries: 
-- system 
-- filesystem 
-- thread 
-- date_time 
-- chrono 
-- regex 
-- serialization 
-- program_options 
-- Found Git: /usr/bin/git 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/user/myproject 

e ha risolto il problema.