2013-03-26 30 views
18

Sto tentando di eseguire il programma, utilizzando il codice di esempio di boost :: filesystem su Ubuntu 12.10, ma non si desidera creare.Impossibile collegare il programma utilizzando Boost.Filesystem

#include <iostream> 
#include <boost/filesystem.hpp> 
using namespace boost::filesystem; 
using namespace std; 

void fun(const string& dirPath); 
int main() 
{ 
    fun("/home"); 
    return 0; 
} 

void fun(const string& dirPath) 
{ 
    path p (dirPath); 

    if (exists(p)) 
    { 
     if (is_regular_file(p)) 
      cout << p << " size is " << file_size(p) << '\n'; 

     else if (is_directory(p))  
      cout << p << "is a directory\n"; 

     else 
      cout << p << "exists, but is neither a regular file nor a directory\n"; 
    } 
    else 
     cout << p << "does not exist\n"; 
} 

E CMake codice:

project(tttest) 
cmake_minimum_required(VERSION 2.8) 
aux_source_directory(. SRC_LIST) 
add_executable(${PROJECT_NAME} ${SRC_LIST}) 
FIND_PACKAGE(Boost 1.53 COMPONENTS filesystem system REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 
link_directories(${Boost_LIBRARY_DIR}) 
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES}) 

Purtroppo genera errori

CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::exists(boost::filesystem::path const&)': 
main.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)' 
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_directory(boost::filesystem::path const&)': 
main.cpp:(.text._ZN5boost10filesystem12is_directoryERKNS0_4pathE[_ZN5boost10filesystem12is_directoryERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)' 
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_regular_file(boost::filesystem::path const&)': 
main.cpp:(.text._ZN5boost10filesystem15is_regular_fileERKNS0_4pathE[_ZN5boost10filesystem15is_regular_fileERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)' 
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)': 
main.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)' 
collect2: error: ld returned 1 exit status 

Qual è la ragione di questo problema e come risolverlo?

+2

cercare di costruire con la versione spinta rilevate automaticamente: FIND_PACKAGE (Boost COMPONENTI sistema di filesystem RICHIESTO) – podshumok

+0

Ho aggiunto cmake ai tag. Questo problema sembra essere correlato a cmake. – drescherjm

+1

L'amplificazione 1.53 è stata riconosciuta dalla versione di CMake? Potresti voler stampare ciò che $ {Boost_LIBRARIES} contiene nel tuo CMakeLists.txt per capire meglio cosa sta succedendo. MESSAGGIO (stato $ {Boost_LIBRARIES}) dovrebbe farlo. – drescherjm

risposta

1

Per alcuni moduli boost, è necessario compilare le librerie e collegandole (utilizzando bootstrap.sh). Nel tuo caso, è necessario compilare e collegare Filesystem, e probalbly System troppo

Dai un'occhiata here

Ad esempio:

  • ./bootstrap.sh (bjam)
  • rm -rf bin.v2 stage (tra 2 comandi bjam)
  • ./bjam release toolset = gcc address-model = 64 cxxflags = -fPIC
  • ./bjam di debug set di strumenti di indirizzo-modello = gcc = 64 CXXFLAGS = -fPIC

Se si stanno connettendo su Windows, non è necessario collegare manualmente le librerie, in quanto essi sono collegati automaticamente utilizzando pragma . Su Linux, devi farlo.

Secondo la documentazione, questi moduli è necessario acquisire o costruire una libreria:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost .ProgramOptions
  • Boost.Python
  • Boost.R egex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Wave
+1

Questo è su linux e mi aspetto che boost sarebbe stato installato tramite il gestore pacchetti in ubuntu. – drescherjm

22

Boost filesystem è uno della libreria Boost che hanno qualche problema ABI relativo alla modifica della firma della funzione dovuta a C++ 0x o C++ 11.biglietto Boost CF: https://svn.boost.org/trac/boost/ticket/6779

Hai tre soluzioni:

  1. Inibizione C++ 11 ambito enumerazioni in Boost preoccupato file di intestazione inclusi nei programmi con #include (cf http://www.ridgesolutions.ie/index.php/2013/05/30/boost-link-error-undefined-reference-to-boostfilesystemdetailcopy_file/):

    #define BOOST_NO_CXX11_SCOPED_ENUMS 
    #include <boost/filesystem.hpp> 
    #undef BOOST_NO_CXX11_SCOPED_ENUMS 
    

    Ma questa soluzione non è completa e ho letto che non funziona per tutti.

  2. Corporatura BOOST con l'opzione C++ 11 (le stesse opzioni che si utilizzano per la propria applicazione): http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide

    ho letto anche non funziona per tutti.

  3. Impostare un cross-compiler dedicato all'applicazione in cui si ricostruiscono tutte le librerie necessarie in un ambiente dedicato. Ciò garantisce coerenza e stabilità oltre a una maggiore manutenibilità ed è certamente la soluzione da raccomandare. Non ho letto se è stato testato - probabilmente sì, e probabilmente funziona. In ogni caso, la compilazione incrociata è ben gestita ora in informatica. Troverete molti buoni tutorial e supporto per questo. In Linux Gentoo, hanno il meraviglioso pacchetto sys-devel/crossdev che lo rende molto facile.

Nel mio caso, la soluzione 1 ha risolto il problema. Non appena ne incontrerò un altro, passerò alla soluzione 3. Quindi, non l'ho ancora testato.

+0

Solo un miglioramento sopra se si utilizza libboost sotto 1.51 utilizzo bisogno di usare #define BOOST_NO_SCOPED_ENUMS #include "boost/filesystem.hpp" BOOST_NO_SCOPED_ENUMS #undef –

+2

notare che per l'opzione 1, ** tutto ** Boost include must avere 'BOOST_NO_CXX11_SCOPED_ENUMS' definito, o le violazioni ODR seguiranno sicuramente. – ildjarn

5

È necessario aggiungere la libreria libboost_filesystem durante il collegamento. Oppure libboost_filesystem-mt se la tua applicazione è multi-thread. Come questo:

g++ -o file -lboost_filesystem-mt source_file.cpp 
+0

E nel caso in cui si utilizzi CMake che sarebbe 'target_link_libraries (my_executable $ {Boost_LIBRARIES})' – Adrian

0

È necessario aggiungere le seguenti librerie:

g++ -o file -lboost_system -lboost_filesystem sourcefile.cpp 

Se si usa un Makefile:

CC=gcc 
CXX=g++ 
PROG = program 
CXXFLAGS := -std=c++1y -g -Wall 
LDFLAGS = -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu 
LIBS= -lboost_system -lboost_filesystem 

SRCS= main.cpp 

OBJS=$(subst .cpp,.o,$(SRCS)) 

all: $(OBJS) 
    $(CXX) $(CXXFLAGS) -o $(PROG) $(OBJS) $(LIBS) $(LDFLAGS) 
Problemi correlati