Мне нужна помощь в этом. Попытка выполнить команду из приложения, разработанного на 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, но выглядит довольно тем же.
Я никогда раньше этого не делал. Я основал библиотеки ускорения компилятора (.so-файлы) в/usr/lib, поэтому я добавляю «-L/usr/lib /» в линию ссылок в Makefile, но это не помогло. Но я не уверен, что это то, о чем вы думаете. – Addman
Ну, это именно то, что я имел в виду. Могли бы вы показать обновленный файл makefile, а также сообщение об ошибке комлета? – biocomp
Я установил boost через менеджер пакетов debian (apt-get). Кажется, что все скомпилированные библиотеки находятся в/usr/lib /. Я думаю, у меня нет источников, поэтому я не могу их перекомпилировать и перестроить. Я включил/usr/lib /, поскольку в библиотеку включены компилятор и компоновщик. И я сделал это также с/usr/lib/libboost- *, и это не помогло (все равно такое же сообщение об ошибке) – Addman