2015-02-27 19 views
34

Ho la seguente configurazione per lo sviluppo C++:Come includere la libreria esterna (boost) nel progetto CLion C++ con CMake?

  • OS X Yosemite
  • CLion 140.2310.6 (un cross-plattform C/C++ - IDE da JetBrains utilizzando CMake come sistema di compilazione)
  • installato boost via brew install boost in /usr/local/Cellar/boost/

Ora, il mio obiettivo è impostare un progetto semplice e includere la libreria boost. Ho definito solo un test.cpp di file che assomiglia a questo:

#include <iostream> 
#include <boost> 

using namespace std; 

int test() { 
    cout << "Hello, World!" << endl; 
    return 0; 
} 

mio CMakeLists.txt file di assomiglia a questo:

cmake_minimum_required(VERSION 2.8.4) 
project(MyProject) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

include_directories("/usr/local/Cellar/boost/1.57.0/include/boost") 

set(SOURCE_FILES main.cpp ./test.cpp) 
add_executable(MyProject ${SOURCE_FILES}) 

Quando costruisco il progetto, ottengo il seguente errore:

/Users/nburk/Documents/uni/master/master_thesis/MyProject/test.cpp:2:10: fatal error: 'boost' file not found

make[3]: *** [CMakeFiles/MyProject.dir/test.cpp.o] Error 1 make[2]: *** [CMakeFiles/MyProject.dir/all] Error 2 make[1]: *** [CMakeFiles/MyProject.dir/rule] Error 2 make: *** [MyProject] Error 2

ho suonato in giro con regolazione percorsi qua e là e anche utilizzando add_library e target_link_libraries, nessuno dei quali ha consentito la corretta realizzazione del progetto.

Qualcuno può indicare nella giusta direzione come assicurarsi di poter includere le funzionalità di boost nel mio progetto CLion C++?

Update: Grazie a @ risposta di Waxo ho usato il seguente codice nel mio CMakeLists.txt file di cui:

set(Boost_INCLUDE_DIR /usr/local/Cellar/boost/1.57.0) 
set(Boost_LIBRARY_DIR /usr/local/Cellar/boost/1.57.0/lib) 
find_package(Boost COMPONENTS system filesystem REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 

io ora ho passato il file non trovato -Errore, ma invece ottengo il seguente:

CMake Error at /Applications/CLion EAP.app/Contents/bin/cmake/share/cmake-3.1/Modules/FindBoost.cmake:685 (file):

file STRINGS file "/usr/local/Cellar/boost/1.57.0/boost/version.hpp" cannot be read.

Call Stack (most recent call first): CMakeLists.txt:11 (find_package)

Qualche idea di cosa mi manca ancora? La linea di cui (685) in FindBoost.cmake è: file(STRINGS "${Boost_INCLUDE_DIR}/boost/version.hpp" _boost_VERSION_HPP_CONTENTS REGEX "#define BOOST_(LIB_)?VERSION ")

+2

Non impostare manualmente le variabili 'Boost'. 'find_package' dovrebbe funzionare immediatamente. In caso contrario, dovresti passare 'Boost_DIR' al comando' cmake'. Non scrivere percorsi specifici del sistema in CMakeLists.txt. L'intero punto di cmake è di essere multipiattaforma. La configurazione specifica della piattaforma dovrebbe essere raramente richiesta e, se è il modo per farlo, è necessario passare i parametri di configurazione tramite la riga di comando o tramite cmake-gui. – sbabbi

+0

se non lo includo, torno al ** file non trovato ** - errore ... tuttavia, sono sicuro che mi manca qualcos'altro e il tuo consiglio sembra avere senso per me! il mio problema principale è che non riesco a capire alcune delle nozioni di base su come funziona effettivamente CMake, quindi suppongo di dover sedermi e fare i compiti perché non riesco a trovare una soluzione banale ... – nburk

+0

Ho notato ora che l'installazione boost è in un percorso non standard ('/ usr/local/cellar'). [Il modo corretto] (http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html) per notificare cmake alla ricerca di boost in quella directory è invocare cmake con 'cmake -DBOOST_ROOT = /usr/local/Cellar/boost/1.57.0 ... ' – sbabbi

risposta

50

Dopo aver trascorso tutto il pomeriggio sulla questione, ho risolto io stesso. È stato un errore piuttosto stupido e tutti i suggerimenti della risposta di @Waxo sono stati davvero utili.

Il motivo per cui non stava lavorando per me che ho scritto nel mio #include <boost>test.cpp -file, che a quanto pare è solo sbagliato. Invece, è necessario fare riferimento direttamente ai file di intestazione che si desidera includere, quindi è preferibile scrivere ad es. #include <boost/thread.hpp>.

Dopo tutto, una breve sequenza di istruzioni dovrebbe essere sufficiente a successo (e la piattaforma-indipendente) comprendono boost in un progetto CMake:

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED) 
include_directories(${Boost_INCLUDE_DIRS}) 
add_executable(BoostTest main.cpp) 
target_link_libraries(BoostTest ${Boost_LIBRARIES}) 

Queste righe stanno facendo la magia qui. Per riferimento, ecco un completo CMakeLists.txt di file che ho usato per il debug in un progetto di linea di comando separata:

cmake_minimum_required(VERSION 2.8.4) 

project(BoostTest) 

message(STATUS "start running cmake...") 

find_package(Boost 1.57.0 COMPONENTS system filesystem REQUIRED) 

if(Boost_FOUND) 

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") 
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}") 
    message(STATUS "Boost_VERSION: ${Boost_VERSION}") 

    include_directories(${Boost_INCLUDE_DIRS}) 

endif() 

add_executable(BoostTest main.cpp) 

if(Boost_FOUND) 

    target_link_libraries(BoostTest ${Boost_LIBRARIES}) 

endif() 
+7

Risposta incredibile, grazie! Per gli utenti di OS X: funzionerà anche quando hai installato Boost utilizzando Homebrew. – Craimasjien

+1

fantastico - sta funzionando, grazie. – Dada

+0

Ho installato 'boost' con MacPorts e sembra che CLion (' versione 1.2.4') sia riuscito a trovarlo automaticamente (senza alcuna modifica in 'CMakeLists.txt'). – irudyak

15

Prova usando CMake find_package (Boost)

src: http://www.cmake.org/cmake/help/v3.0/module/FindBoost.html

Funziona meglio e CMake è fatto per la compilazione e dare un percorso assoluto non è buono in un progetto CMake.

Edit:

Guardate anche questo: How to link C++ program with Boost using CMake

Perché non si collega in realtà la libreria spinta al vostro eseguibile.

CMake con boost di solito si presenta così:

set(Boost_USE_STATIC_LIBS  ON) # only find static libs 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.57.0 COMPONENTS date_time filesystem system ...) 
if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    add_executable(foo foo.cc) 
    target_link_libraries(foo ${Boost_LIBRARIES}) 
endif() 
+0

Mi sono imbattuto anche in questa domanda e in realtà ha funzionato in modo che non avessi ottenuto il ** file non trovato ** - errore più ... tuttavia, Ora ho un nuovo errore: 'file STRINGS file /usr/local/Cellar/boost/1.57.0/boost/version.hpp" non può essere letto . ... Ho aggiornato la mia domanda, qualche idea? – nburk

+2

Teoricamente tu non devi impostare Boost_INCLUDE_DIR e Boost_LIBRARY_DIR, è il lavoro della linea find_package (Boost). E non dimenticare la linea di collegamento Se l'errore persiste, dai un'occhiata ai diritti sul file. – Waxo

+1

Grazie È stato un piacere aiutare, ho dei momenti difficili quando ho iniziato a CMake, buona fortuna – Waxo

Problemi correlati