2013-03-26 5 views
18

Я пытаюсь запустить программу, используя пример кода boost :: filesystem на Ubuntu 12.10, но он не хочет строить.Не удается связать программу с помощью 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"; 
} 

И CMake код:

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

К сожалению, это порождает ошибки

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 

Что является причиной этой проблемы и как ее решить?

+2

пытается построить с автоопределением повышающей версии: FIND_PACKAGE (Boost КОМПЬЮТЕРНАЯ СИСТЕМА СИСТЕМЫ ТРЕБУЕТСЯ) – podshumok

+0

Я добавил cmake к тегам. Эта проблема, по-видимому, связана с cmake. – drescherjm

+1

Является ли boost 1.53 признанным вашей версией CMake? Вы можете распечатать, что $ {Boost_LIBRARIES} содержит в вашем CMakeLists.txt, чтобы лучше понять, что происходит. СООБЩЕНИЕ (статус $ {Boost_LIBRARIES}) должен это сделать. – drescherjm

ответ

1

Для некоторых модулей boost вам необходимо скомпилировать библиотеки и, связав их (используя bootstrap.sh). В вашем случае, вы должны скомпилировать и ссылку Filesystem и probalbly System слишком

Взгляните here

Например:

  • ./bootstrap.sh (bjam)
  • rm -rf bin.v2 stage (между двумя командами bjam)
  • ./bjam release toolset = gcc адрес-модель = 64 cxxflags = -fPIC
  • ./bjam отладочный набор инструментов = НКУ адресно-модель = 64 CXXFLAGS = -fPIC

Если вы ссылаетесь на Windows, вам не нужно вручную связать свои библиотеки, так как они будут автоматически связаны с использованием прагму , В Linux вы должны это сделать.

Согласно документации, эти модули должны вам приобрести или построить библиотеку:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • подталкивания .ProgramOptions
  • Boost.Python
  • Boost.R egex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Wave
+1

Это на linux, и я ожидаю, что boost будет установлен через менеджера пакетов в ubuntu. – drescherjm

22

подталкивания файловая система является одним из библиотеки Boost, которые имеют некоторые проблемы ABI относительно изменения сигнатуры функции из-за C++ 0x или C++ 11.сравни подталкивания билет: https://svn.boost.org/trac/boost/ticket/6779

У вас есть три решения:

  1. Inhibit C++ 11 перечислений в области видимости обеспокоенный подталкивания заголовочные файлы, включенные в свои программы с #include (см 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 
    

    Но это решение не является полным, и я читал, что это не работает для всех.

  2. Построить BOOST с опцией C++ 11 (те же параметры, которые вы используете для вашего приложения): http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide

    Я прочитал и это не работает для всех.

  3. Настройте кросс-компилятор, посвященный вашему приложению, где вы перестраиваете все библиотеки, которые вам нужны в выделенной среде. Это обеспечивает согласованность плюс стабильность плюс более ремонтопригодность и, безусловно, является решением для рекомендации. Я не читал, если он был протестирован - возможно, да, и, вероятно, он работает. Во всяком случае, кросс-компиляция хорошо освоена сейчас в области информатики. Вы найдете много хороших учебных пособий и поддержки. В Linux Gentoo у них есть чудесный пакет sys-devel/crossdev, который делает его очень легким.

В моем случае решение 1 решило проблему. Как только я столкнусь с другим, я переключусь на решение 3. Итак, я еще не тестировал его.

+0

Только один улучшению выше, если вы используете libboost ниже 1.51 использования необходимо использовать #define BOOST_NO_SCOPED_ENUMS #include «подталкивание/filesystem.hpp» директивы #undef BOOST_NO_SCOPED_ENUMS –

+2

Обратите внимание, что для варианта 1, ** всех ** подталкивание включает в сусло имеют 'BOOST_NO_CXX11_SCOPED_ENUMS', или нарушения ODR обязательно последуют. – ildjarn

5

При связывании вам нужно добавить библиотеку libboost_filesystem. Или libboost_filesystem-mt, если ваше приложение многопоточное. Как это:

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

И в случае, если вы используете CMake, который будет 'target_link_libraries (my_executable $ {Boost_LIBRARIES})' – Adrian

0

Вам необходимо добавить следующие библиотеки:

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

Если вы используете 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) 
Смежные вопросы