包括 Boost 文件系统标头
Posted
技术标签:
【中文标题】包括 Boost 文件系统标头【英文标题】:Including the Boost filesystem header 【发布时间】:2014-02-03 14:46:34 【问题描述】:我有一个大项目。
在N.cpp
我需要使用boost::filesystem::exists(path)
来检查路径是否有效。
为此,我包括<boost/filesystem.hpp>
我收到以下错误:
Error 2 error LNK2005: "public: enum boost::filesystem::file_type __cdecl boost::filesystem::file_status::type(void)const " (?type@file_status@filesystem@boost@@QEBA?AW4file_type@23@XZ) already defined in N.obj D:\MProject\DA\boost_filesystem-vc100-mt-gd-1_53.lib(boost_filesystem-vc100-mt-gd-1_53.dll) DA
Error 1 error LNK2005: "public: __cdecl boost::filesystem::path::~path(void)" (??1path@filesystem@boost@@QEAA@XZ) already defined in N.obj D:\MProject\DAboost_filesystem-vc100-mt-gd-1_53.lib(boost_filesystem-vc100-mt-gd-1_53.dll) DA
Error 3 error LNK1104: cannot open file 'libboost_filesystem-vc100-mt-gd-1_53.lib' D:\MProject\DA\LINK DA
如果我不包含头文件,我会得到:
Error 2 error C3861: 'exists': identifier not found D:\MProject\DA\ThirdParty\N.cpp 108 1 DA
Error 1 error C2653: 'boost' : is not a class or namespace name D:\MProject\DA\ThirdParty\N.cpp 108 1 DA
使用boost::filesystem::exists
以便编译整个程序的正确方法是什么?
N.cpp
#include <boost/filesystem.hpp>
.....
CHECK( boost::filesystem::exists(*i), std::string("file ").append(*i).append(" does not exist").c_str() );
.....
【问题讨论】:
您需要向链接器展示如何找到库,对于boost::filesystem
,仅包含是不够的。我认为您使用的是Windows,对吗?尝试第一次阅读here。
@wesley.mesquita 项目本身知道库在哪里。Boost 函数在所有地方都使用。问题是多个定义或多个包含同一个标题,我猜。我就是不知道怎么解决。
使用来自您的来源的 sn-p 编辑您的问题,可能会有所帮助。特别是您的包含会话。
@wesley.mesquita 完成
看看here,好像是重复的。
【参考方案1】:
我通过添加到 N.cpp 解决了这个问题:
#ifndef BOOST_ALL_DYN_LINK
# define BOOST_ALL_DYN_LINK
#endif
#include <boost/filesystem.hpp>
【讨论】:
【参考方案2】:如果你想使用boost::filesystem
,你必须包含头文件(直接或间接通过其他包含)。
前三个错误是链接器错误。 Boost 的某些部分仅是标头,即当您想使用它们时不必编译 Boost。不幸的是,文件系统不是其中之一。这意味着你必须像here 中描述的那样编译 Boost。之后你必须告诉你的链接器它在哪里可以找到你刚刚创建的二进制文件并且它应该编译得很好(如果你没有犯任何其他错误;-))。
【讨论】:
以上是关于包括 Boost 文件系统标头的主要内容,如果未能解决你的问题,请参考以下文章
Boost Multiindex:示例在 cpp 文件中编译,但不在标头中