0

我需要这方面的帮助。尝试从用 C++ 开发的应用程序执行命令,我想直接读取结果。

  • 操作系统:Debian 7 Wheezy
  • boost_ver:1.49(来自 debian 存储库)
  • 编译器:g++

我已经使我的程序尽可能短以识别问题。

基本上我试图做这样的事情

但我的问题出在其他地方,我想我不知道如何正确使用 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 的错误消息,但看起来非常相似。

4

2 回答 2

1

Boost.Iostreams 不是一个只有头文件的库。您需要通过在链接命令中添加类似这样的内容来链接到它:-lboost-iostreams

于 2013-07-29T13:51:06.237 回答
1

很难说没有看到实际错误,但原因之一可能是 boost::iostream 的某些部分需要链接到已编译的 boost iostream 库和正则表达式。如果不是这种情况,请在此处仅提供链接器错误,它会让我们更好地帮助您。

编辑 我不太熟悉 G++ 如何表达缺少的 lib,但在我看来这就是问题所在。

看起来 boost 自动链接功能在这里不起作用(否则你会得到带有 lib 文件名的显式丢失 lib 错误),所以你需要验证你:

  1. 已经建立了提升库
  2. 在你的 makefile 中包含了 boost iostream lib

这应该会有所帮助,或者至少可以解决一些错误。

于 2013-07-28T21:57:10.580 回答