[英]c++ What files and libs to include?
很多时候我在 Internet 上找到有用的代码示例。 大约有一半的时间,他们没有使用 -l 指定要包含哪些文件,甚至没有指定要在命令行中包含哪些库。 你通常是怎么发现的?
编辑说明:以下问题已解决。 这篇文章的其余部分可以跳过。
现在,我在尝试编译时遇到了很多错误:
53: string Gunzip::gunzip(string& compressed)
54: {
55: namespace io = boost::iostreams;
56:
57: io::filtering_istream gunzip;
58: gunzip.push(io::gzip_decompressor());
59: std::istringstream in_stream = std::istringstream(compressed);
60: gunzip.push(in_stream);
61:
62: stringstream strstream;
63: io::copy(gunzip, strstream);
64: return strstream.str();
65: }
在互联网上呆了一天后,我正在尝试:
option: 3 -L/usr/include/boost
and:
8: #include <string>
9: #include <iostream>
10: #include <sstream>
15: #include <boost/iostreams/copy.hpp>
16: #include <boost/iostreams/device/array.hpp>
17: #include <boost/iostreams/device/back_inserter.hpp>
18: #include <boost/iostreams/filter/gzip.hpp>
19: #include <boost/iostreams/filter/test.hpp>
20: #include <boost/iostreams/filtering_stream.hpp>
我的错误是:
from /usr/include/c++/4.5/string:45,
from Gunzip.cpp:8:
/usr/include/c++/4.5/bits/ios_base.h: In copy constructor ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’:
In file included from /usr/include/c++/4.5/bits/localefwd.h:43:0,
/usr/include/c++/4.5/bits/ios_base.h:785:5: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
/usr/include/c++/4.5/iosfwd:77:11: error: within this context
/usr/include/c++/4.5/iosfwd: In copy constructor ‘std::basic_istringstream<char>::basic_istringstream(const std::basic_istringstream<char>&)’:
/usr/include/c++/4.5/iosfwd:97:11: note: synthesized method ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’ first required here
/usr/include/c++/4.5/streambuf: In copy constructor ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’:
/usr/include/c++/4.5/streambuf:773:7: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>::__streambuf_type&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]’ is private
/usr/include/c++/4.5/iosfwd:93:11: error: within this context
/usr/include/c++/4.5/iosfwd: In copy constructor ‘std::basic_istringstream<char>::basic_istringstream(const std::basic_istringstream<char>&)’:
/usr/include/c++/4.5/iosfwd:97:11: note: synthesized method ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’ first required here
Gunzip.cpp: In member function ‘std::string Gunzip::gunzip(std::string&)’:
Gunzip.cpp:59:65: note: synthesized method ‘std::basic_istringstream<char>::basic_istringstream(const std::basic_istringstream<char>&)’ first required here
make[2]: Leaving directory `/home/albert/NetBeansProjects/Arb3'
make[1]: Leaving directory `/home/albert/NetBeansProjects/Arb3'
make[2]: *** [build/Debug/GNU-Linux-x86/Gunzip.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 9s)
我可以删除前 3 个包含以获取其他我不理解的错误。 我不知道哪个错误更好。
您发布的错误实际上不是与包含相关的错误,也不是 linker 错误,它是以下行:
std::istringstream in_stream = std::istringstream(compressed);
这会导致调用标记为私有的继承的复制构造函数,因此您应该将其替换为:
std::istringstream in_stream(compressed);
编译器 output 在这种情况下其实是很清楚的。
简短的回答是“视情况而定”。 对于属于 C++ 标准库的类/函数,编译器随附的手册页将列出所需的头文件和库; 或者,您也可以使用在线资源,例如cplusplus.com 、 MSDN或GNU libstdc++ doxygen docs 。
对于像 Boost 这样的东西,你必须查看他们的文档; 然而,显而易见的问题是“我怎么知道 class 是否来自 boost”——答案几乎是“谷歌它”——随着时间的推移,你会习惯 Boost 中的内容。
一般来说,如果您找不到所需的库或不知道如何构建和使用它,找到此类信息的最佳位置是:项目的文档或 wiki 页面、论坛或 IRC 频道。 要查找类/函数所属的项目,您可以使用类/函数的名称进行搜索。
对于上面的代码片段,您需要Boost 。 大多数情况下,您需要做的就是#include
header 文件。 但是某些库需要您构建和链接它们。 有关说明,请参阅“ Microsoft Windows 入门”或“ Unix 变体(例如 Linux、MacOS)入门”。
如果您正在使用 Windows 机器,您可以从这里下载预编译的二进制文件: http://www.boostpro.com/download/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.