我是VC++和Boost的新手.我的问题是我想在我的VC++ Visual Studio 2013项目中使用Boost 1.56.0(所以我使用vc120).
我已经通过NuGet安装了Boost(https://www.nuget.org/packages/boost/).一切似乎都没问题,但当我尝试构建我的项目时,它说:
致命错误LNK1104:无法打开文件"libboost_thread-vc120-mt-gd-1_56.lib".
你知道问题究竟在哪里以及我如何解决它?
我认为使用NuGet安装一个软件包将完成所有工作以使其自行运行.我知道链接器找不到lib文件(实际上根本没有构建过程).但我不知道如何解决这个问题.
我认为用VC120手动编译Boost并将lib文件夹添加到链接器的其他路径并不是一个好主意.那我为什么要使用NuGet呢?
欢迎任何帮助 - 我正在尝试和搜索互联网这么多个小时,我无法解决问题.
谢谢Stefan
下面是使用很棒的Boost.Serialization库的最小示例。
要编译该库,我需要链接到boost_serialization预编译的库。
$ c++ -std=c++11 example.cpp -o example.x -lboost_serialization
^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
该库经过大量模板化,尽管内部很复杂,但实际代码(函数体)非常简单。只有少数参考文献需要链接,即:
boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::ostream&, unsigned int)
boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::text_iarchive_impl(std::istream&, unsigned int)
boost::archive::text_iarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()
boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::~text_iarchive_impl()
...
boost::archive::archive_exception::~archive_exception()'
Run Code Online (Sandbox Code Playgroud)
是否有可能在不链接为仅标头库的情况下使用该库?
例如一些未记录的技巧或黑客行为?
这将使其在某些超级计算机集群和环境中使用起来更加简单,而在这些环境中,编译 Boost 并不是那么简单。
#include<sstream>
#include<numeric>
#include<boost/archive/text_oarchive.hpp> // needs linking
#include<boost/archive/text_iarchive.hpp>
#include<boost/serialization/vector.hpp>
int main(){
std::vector<double> v(10); std::iota(v.begin(), v.end(), 0);
std::stringstream ss;
{
boost::archive::text_oarchive toa(ss);
toa << v;
}
std::vector<double> v2;
boost::archive::text_iarchive tia(ss);
tia >> v2;
assert(v == v2);
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果库提供仅标头的选项,就像 Boost.Asio 那样(/sf/answers/2851060761/。)
EDIT2:Boost.Serialization 的作者和维护者拒绝了仅将其设为标头的想法。https://github.com/boostorg/serialization/issues/71
在我的应用程序中,我包括boost/system/error_code.hpp(boost 1.58),但不想链接到boost_system,而是有一个只有标头的解决方案.我读到定义BOOST_ERROR_CODE_HEADER_ONLY应该是可能的.但不幸的是,它没有按预期工作.我仍然得到boost :: system :: system_category()的链接器错误.
我想知道这是否应该起作用,如果是这样的话.boost标头中的代码是:
# ifdef BOOST_ERROR_CODE_HEADER_ONLY
inline const error_category & system_category() BOOST_SYSTEM_NOEXCEPT;
inline const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT;
#else
BOOST_SYSTEM_DECL const error_category & system_category() BOOST_SYSTEM_NOEXCEPT;
BOOST_SYSTEM_DECL const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT;
#endif
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,没有为system_category()定义主体.如果没有链接到lib,这怎么可以工作呢?
更新:
在此期间,我发现了声明的主体定义在哪里(文件中boost/system/detail/error_code.hpp包含了boost/system/error_code.hpp它.仍然没有避免链接器错误.我正在使用XCode(llvm C++ 11)并BOOST_ERROR_CODE_HEADER_ONLY在目标中定义设置,如果重要的话.
我需要向我的网站发送HTTP GET请求,然后获取页面内容并解析它.我宁愿不使用像libCURL这样的库,因为我希望最终应用程序完全独立(这是从个人经验中引用的,我可能错了,但如果我记得客户端必须有某些动态链接库来运行带有libCURL的应用程序库.),我在Visual Studio 2012中使用C++.
代码示例也很好.