我正在尝试学习如何使用Boost C ++库,但我遇到了一个问题。运行以下boost :: filesystem教程代码时:
#include <iostream>
#include <boost/filesystem.hpp>
using std::cout;
using namespace boost::filesystem;
int main(int argc, char* argv[])
{
if (argc < 2)
{
cout << "Usage: tut3 path\n";
return 1;
}
path p (argv[1]);
try
{
if (exists(p))
{
if (is_regular_file(p))
cout << p << " size is " << file_size(p) << '\n';
else if (is_directory(p))
{
cout << p << " is a directory containing:\n";
for (directory_entry& x : directory_iterator(p))
cout << " " << x.path() << '\n';
}
else
cout << p << " exists, but is not a regular file or directory\n";
}
else
cout << p << " does not exist\n";
}
catch (const filesystem_error& ex)
{
cout << ex.what() << '\n';
}
return 0;
}
并编译:
g++ -std=c++11 main.cpp -o main -L$BOOST_ROOT -lboost_filesystem -lboost_system
或:
g++ -std=c++11 main.cpp -o main -L$BOOST_ROOT -lboost_system -lboost_filesystem
其中BOOST_ROOT是我提取boost_1_62_0.tar.gz的路径,我收到以下错误:
FoamData.cpp:36:76: error: ‘begin’ was not declared in this scope
for (auto&& x : boost::filesystem::directory_iterator(p))
^
FoamData.cpp:36:76: note: suggested alternative:
In file included from /usr/include/c++/5/vector:66:0,
from FoamData.hpp:4,
from FoamData.cpp:1:
/usr/include/c++/5/bits/range_access.h:87:5: note: ‘std::begin’
begin(_Tp (&__arr)[_Nm])
^
FoamData.cpp:36:76: error: ‘end’ was not declared in this scope
for (auto&& x : boost::filesystem::directory_iterator(p))
^
FoamData.cpp:36:76: note: suggested alternative:
In file included from /usr/include/c++/5/vector:66:0,
from FoamData.hpp:4,
from FoamData.cpp:1:
/usr/include/c++/5/bits/range_access.h:97:5: note: ‘std::end’
end(_Tp (&__arr)[_Nm])
^
make: *** [FoamData.o] Error 1
我事先道歉,如果我掩饰了一些显而易见的东西。
修改
后续boost_filesystem教程中的以下语句给出了同样的错误:
for(auto&& x : directory_iterator(p))
代码来源: boost::filesystem tutorials
更新
我重新编译了boost_1_62_0并运行了教程脚本来构建教程代码(根据boost文件系统教程)。构建的教程程序正常工作。但是,在$BOOST_ROOT
之外使用g ++进行编译时,我收到以下错误:
./tester: error while loading shared libraries: libboost_system.so.1.62.0: cannot open shared object file: No such file or directory
以下是我的makefile
:
CC=g++
INCLUDE=-I/usr/local/boost_1_62_0
CFLAGS=-std=c++11 -Wall -Wextra -g
LDFLAGS=-lboost_filesystem -lboost_system
LDLIB=-L/usr/local/boost_1_62_0/stage/lib
all: tester
tester: main.o
$(CC) main.o $(LDLIB) $(LDFLAGS) $(CFLAGS) -o tester
main.o: main.cpp
$(CC) -c main.cpp $(INCLUDE) $(CFLAGS)
clean:
rm *.o tester
最终更新
我可以通过将此错误添加到我的.bashrc
export LD_LIBRARY_PATH="$BOOST_ROOT/stage/lib:$LD_LIBRARY_PATH"
感谢您的帮助!
答案 0 :(得分:2)
很可能您的代码使用了错误(且过时)的系统Boost库begin()
中未提供end()
和directory_iterator
成员。
原因是,在您的g ++命令行中,您使用-L
提供了额外的库路径,但是您忘记使用-I
添加额外的包含路径。
您可以为升级版本添加编译时检查,如下所示:
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(BOOST_VERSION >= 106200) // check for at least 1.62.0
答案 1 :(得分:0)
请尝试使用以下语法:
if (is_directory(p))
{
directory_iterator end_iter;
for (directory_iterator dir_itr(p);
dir_itr != end_iter;
++dir_itr)
{
std::cout << dir_itr->path().filename() << "\n";
}
}
这将列出目录中的所有文件。
您的代码的问题在于您没有将directory_iterator(p)
返回的对象视为迭代器。
您在for
循环中使用的语法需要range expression,在这种情况下应该是一个具有begin
和end
方法的对象迭代器。从错误中可以看出,编译器正在寻找这些成员。
Howerver,你已经明确地创建了开始迭代器 - 你来不及使用for
循环的范围语法。