我需要帮助。尝试从C ++开发的应用程序执行命令,我想直接读取结果。
我已经尽可能地缩短了我的程序以确定问题。
基本上我试图做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 $@
fd.o:
$(CPPC) $(FLAGS) $(INC) -c $(SOURCES) -o $@
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
编辑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 $@
fd.o:
$(CPPC) $(FLAGS) $(INC) -c $(SOURCES) -o $@
clean:
rm -f $(EXE)
它还没有用。我没有在旧的和新的Makefile的错误消息之间做差异,但看起来非常相似。
答案 0 :(得分:1)
很难说没有看到实际错误,但其中一个原因可能是boost :: iostream的某些部分需要链接到已编译的boost iostream库和regex。如果情况并非如此,请在此处提供链接器错误,它会让我们更好地帮助您。
修改强> 我不太熟悉G ++如何表达遗漏的lib,但是我觉得这就是问题所在。
看起来升级自动链接功能在这里不起作用(否则你会发现lib文件名显式缺少lib错误),所以你需要验证你:
这应该有所帮助,或者至少可以解决一些错误。
答案 1 :(得分:1)
Boost.Iostreams不是仅限标头的库。您需要通过向链接命令添加类似内容来链接到它:-lboost-iostreams
。