这是一个复盘帖,将遇到的boost的相关问题复盘一下, 先贴上我的代码部分:
if (boost::filesystem::is_directory(mypath))
{
boost::filesystem::directory_iterator end_iter;
std::cout << "mypath is a directory! " << mypath.string() << std::endl;
boost::filesystem::directory_iterator iter(mypath);
std::cout << "goto for loop " << std::endl;
for (; iter != end_iter; ++iter)
{
std::cout << "current filename: " << boost::filesystem::is_regular_file(iter->status()) << std::endl;
if (boost::filesystem::is_regular_file(iter->status()) &&
((iter->path().extension().string() == ".png") || (iter->path().extension().string() == ".bmp")))
{
filenames.push_back(iter->path().string());
}
if (boost::filesystem::is_directory(iter->status()))
{
get_filenames(iter->path().string(), filenames);
}
}
}
想要用boost循环读取文件夹下的图片, 代码测试过没有问题,但是在另一台电脑上出现段错误, 提示是在boost::filesystem::directory_iterator iter(mypath) 这一行, 原本想着会不会是boost版本的问题, 但是看到了这个issue:
Sementation fault on boost iterator 里面作者提到自己的g++版本切换到6.2之后文件就不能用了, 利用
g++ --version
gcc --version
查看了一下自己的版本,发现是g++7, 而原本可以执行这个文件的电脑上g++版本是5.6, 于是安装g++5, 并且切换版本:
#安装
sudo apt-get install g++-5 gcc-5
#把gcc5的优先级设置地高一点
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
#查看当前的可用版本
sudo update-alternatives --config gcc
查看版本之后看到当前已经默认使用了gcc5
仅仅这样还是不行,切换版本之后删除原先的boost, 再重新编译安装;
sudo rm -rf /usr/local/include/boost
sudo rm -rf /usr/local/lib/libboost*
在安装boost之前,可以添加prefix, 指定一下安装目录:
gedit bootstrap.sh
将 原来的 PREFIX=/usr/local/ 修改为PREFIX=/usr/local/ boost_1_66, 这样再次执行 后boost就被安装到该目录下;
sudo ./bootstrap.sh
sudo ./b2 install
安装完成,查看boost,结果如下:
lib和头文件都在这里了;
接下来将之前出问题的编译程序清除后,重新编译, 这里附上在cmakelists中包含boost的方法:
include_directories("/usr/local/boost_1_66/include/")
link_directories("/usr/local/boost_1_66/lib/")
add_executable(exe_name main.cpp)
target_link_libraries(exe_name
-lboost_filesystem
-lboost_system
)
编译完成后,问题解决;
参考: