2013-07-28 2 views
0

Мне нужна помощь в этом. Попытка выполнить команду из приложения, разработанного на C++, и я хочу прочитать результат напрямую.чтение результата выполнения команды с boost (библиотеки C++)

  • ОС: Debian 7 астматический
  • boost_ver: 1,49 (из репозитория Debian)
  • компилятора: г ++

Я цветовым мою программу кратчайшее возможное, чтобы определить проблему.

В основном я пытаюсь сделать что-то вроде this.

Но моя проблема лежит где-то еще, я думаю, что я не знаю, как правильно использовать библиотеку boost (так как это первый раз, когда я использовал другие, а затем std).

Чтобы вырезать Короче говоря, вот мой код:

fd.cpp:

//STD libraries 
#include <iostream> 

//BOOST libraries 
#include <stream.hpp> 
#include <file_descriptor.hpp> 

typedef boost::iostreams::stream boost::iostreams::file_descriptor_sink> 
     boost_stream; 

int main() { 

    FILE *file; 

    file = popen("./dumm", "r"); 

    if (!file) { 
     return 7; 
    } 

    boost_stream bs; 

    pclose(file); 

} 

и мой Makefile:

CPPC=g++ 
FLAGS=-Wall -fpermissive 
INC=-I/usr/include/boost/iostreams/ -I/usr/include/boost/iostreams/device/ 
SOURCES=fd.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXE=x 

all: $(EXE) 

$(EXE): clean fd.o 
    $(CPPC) $(OBJECTS) -o [email protected] 

fd.o: 
    $(CPPC) $(FLAGS) $(INC) -c $(SOURCES) -o [email protected] 

clean: 
    rm -f $(EXE) 

Я могу скомпилировать fd.o, но не создавать исполняемый файл. Включены ли мои исправления? Я думаю, что может быть проблема.

Я не буду публиковать результат make, потому что он очень длинный, в основном это показывает некоторые проблемы с привязкой. Но если вы хотите, я могу отредактировать &. Оба кода должны быть исполняемыми.

Спасибо!

РЕДАКТИРОВАТЬ:

поэтому результат make является:

fd.o: In function `int boost::iostreams::detail::read_device_impl<boost::iostreams::input>::read<boost::iostreams::file_descriptor>(boost::iostreams::file_descriptor&, boost::iostreams::char_type_of<boost::iostreams::file_descriptor>::type*, int)': 
fd.cpp:(.text._ZN5boost9iostreams6detail16read_device_implINS0_5inputEE4readINS0_15file_descriptorEEEiRT_PNS0_12char_type_ofIS7_E4typeEi[_ZN5boost9iostreams6detail16read_device_implINS0_5inputEE4readINS0_15file_descriptorEEEiRT_PNS0_12char_type_ofIS7_E4typeEi]+0x1b): undefined reference to `boost::iostreams::file_descriptor::read(char*, int)' 
fd.o: In function `int boost::iostreams::detail::write_device_impl<boost::iostreams::output>::write<boost::iostreams::file_descriptor>(boost::iostreams::file_descriptor&, boost::iostreams::char_type_of<boost::iostreams::file_descriptor>::type const*, int)': 
fd.cpp:(.text._ZN5boost9iostreams6detail17write_device_implINS0_6outputEE5writeINS0_15file_descriptorEEEiRT_PKNS0_12char_type_ofIS7_E4typeEi[_ZN5boost9iostreams6detail17write_device_implINS0_6outputEE5writeINS0_15file_descriptorEEEiRT_PKNS0_12char_type_ofIS7_E4typeEi]+0x1b): undefined reference to `boost::iostreams::file_descriptor::write(char const*, int)' 
fd.o: In function `void boost::iostreams::detail::close_impl<boost::iostreams::closable_tag>::close<boost::iostreams::file_descriptor>(boost::iostreams::file_descriptor&, std::_Ios_Openmode)': 
fd.cpp:(.text._ZN5boost9iostreams6detail10close_implINS0_12closable_tagEE5closeINS0_15file_descriptorEEEvRT_St13_Ios_Openmode[_ZN5boost9iostreams6detail10close_implINS0_12closable_tagEE5closeINS0_15file_descriptorEEEvRT_St13_Ios_Openmode]+0x17): undefined reference to `boost::iostreams::file_descriptor::close()' 
fd.o: In function `std::fpos<__mbstate_t> boost::iostreams::detail::seek_device_impl<boost::iostreams::any_tag>::seek<boost::iostreams::file_descriptor>(boost::iostreams::file_descriptor&, long long, std::_Ios_Seekdir, std::_Ios_Openmode)': 
fd.cpp:(.text._ZN5boost9iostreams6detail16seek_device_implINS0_7any_tagEE4seekINS0_15file_descriptorEEESt4fposI11__mbstate_tERT_xSt12_Ios_SeekdirSt13_Ios_Openmode[_ZN5boost9iostreams6detail16seek_device_implINS0_7any_tagEE4seekINS0_15file_descriptorEEESt4fposI11__mbstate_tERT_xSt12_Ios_SeekdirSt13_Ios_Openmode]+0x35): undefined reference to `boost::iostreams::file_descriptor::seek(long long, std::_Ios_Seekdir)' 
collect2: error: ld returned 1 exit status 
make: *** [x] Error 1 

EDIT 2:

обновленный файл Makefile:

CPPC=g++ 
    FLAGS=-Wall -fpermissive 
    INC=-I/usr/include/boost/iostreams/ -I/usr/include/boost/iostreams/device/ -L/usr/lib/ 
    SOURCES=fd.cpp 
    OBJECTS=$(SOURCES:.cpp=.o) 
    EXE=x 

    all: $(EXE) 

    $(EXE): clean fd.o 
     $(CPPC) $(INC) $(OBJECTS) -o [email protected] 

    fd.o: 
     $(CPPC) $(FLAGS) $(INC) -c $(SOURCES) -o [email protected] 

    clean: 
     rm -f $(EXE) 

И его все еще не работает. Я не делал diff между сообщением об ошибке старого и нового Makefile, но выглядит довольно тем же.

ответ

1

Трудно сказать, не видя фактической ошибки, но одной из причин может быть то, что части boost :: iostream требуют ссылки на скомпилированную библиотеку iostream boost и регулярное выражение. Если это не так, пожалуйста, предоставьте здесь только ошибки компоновщика, это позволит нам помочь вам лучше.

EDIT Я не очень знаком с тем, как G ++ бы выразить недостающую LIB, но loooks мне, что это проблема.

Похоже, повышение автоматической функции связующей не работает здесь (в противном случае вы получите явное отсутствие Lib ошибки с Lib именем файла), поэтому вам нужно убедиться, что вы:

  1. построили подталкивание LIBS
  2. включили boost iostream lib в ваш файл makefile

Это должно помочь или хотя бы исправить некоторые ошибки.

+0

Я никогда раньше этого не делал. Я основал библиотеки ускорения компилятора (.so-файлы) в/usr/lib, поэтому я добавляю «-L/usr/lib /» в линию ссылок в Makefile, но это не помогло. Но я не уверен, что это то, о чем вы думаете. – Addman

+0

Ну, это именно то, что я имел в виду. Могли бы вы показать обновленный файл makefile, а также сообщение об ошибке комлета? – biocomp

+0

Я установил boost через менеджер пакетов debian (apt-get). Кажется, что все скомпилированные библиотеки находятся в/usr/lib /. Я думаю, у меня нет источников, поэтому я не могу их перекомпилировать и перестроить. Я включил/usr/lib /, поскольку в библиотеку включены компилятор и компоновщик. И я сделал это также с/usr/lib/libboost- *, и это не помогло (все равно такое же сообщение об ошибке) – Addman

1

Boost.Iostreams не является библиотекой только для заголовков. Вам нужно связать с ним, добавив что-то вроде этого в вашу ссылку: -lboost-iostreams.

Смежные вопросы