我正在尝试运行程序,在Ubuntu 12.10上使用boost :: filesystem的示例代码,但它不想构建。
#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
using namespace std;
void fun(const string& dirPath);
int main()
{
fun("/home");
return 0;
}
void fun(const string& dirPath)
{
path p (dirPath);
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\n";
else
cout << p << "exists, but is neither a regular file nor a directory\n";
}
else
cout << p << "does not exist\n";
}
和CMake代码:
project(tttest)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
FIND_PACKAGE(Boost 1.53 COMPONENTS filesystem system REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES})
不幸的是它会产生错误
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::exists(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_directory(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem12is_directoryERKNS0_4pathE[_ZN5boost10filesystem12is_directoryERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::is_regular_file(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem15is_regular_fileERKNS0_4pathE[_ZN5boost10filesystem15is_regular_fileERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/tttest.dir/main.cpp.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)':
main.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status
这个问题的原因是什么以及如何解决?
答案 0 :(得分:24)
Boost文件系统是Boost库之一,由于C ++ 0x或C ++ 11而导致相对于函数签名更改存在一些ABI问题。 cf Boost ticket:https://svn.boost.org/trac/boost/ticket/6779
您有三种解决方案:
使用#include(cf http://www.ridgesolutions.ie/index.php/2013/05/30/boost-link-error-undefined-reference-to-boostfilesystemdetailcopy_file/)在程序中包含的相关Boost头文件中禁止C ++ 11范围的枚举:
#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
#undef BOOST_NO_CXX11_SCOPED_ENUMS
但是这个解决方案不是一个完整的解决方案,而且我认为它并不适合所有人。
使用C ++ 11选项构建BOOST(与您的应用程序使用的选项相同):http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide
我也读到它并不适合所有人。
设置专用于您的应用程序的交叉编译器,您可以在专用环境中重建所需的所有库。这确保了一致性和稳定性以及更高的可维护性,并且肯定是推荐的解决方案。 我还没看过它是否经过测试 - 可能是的,也许它可行。无论如何,现在计算机科学已经很好地掌握了交叉编译。你会发现很多很好的教程和支持。在Linux Gentoo中,他们拥有非常棒的sys-devel / crossdev软件包,非常容易。
就我自己而言,解决方案1解决了这个问题。一旦我遇到另一个,我将切换到解决方案3.所以,我还没有测试过它。
答案 1 :(得分:9)
链接时需要添加libboost_filesystem库。或者libboost_filesystem-mt,如果您的应用程序是多线程的。像这样:
g++ -o file -lboost_filesystem-mt source_file.cpp
答案 2 :(得分:2)
对我有用的解决方案是使用&#34; -c&#34;然后像这样创建可执行文件:
g++ -c -o main.o main.cpp
g++ -o my_prog main.o -lboost_system -lboost_filesystem
答案 3 :(得分:1)
对于某些boost模块,您必须编译库和链接它们(使用bootstrap.sh)。
在您的情况下,您必须编译并链接Filesystem
,并且也可以System
看看here
例如:
如果您在Windows上进行链接,则不必手动链接库,因为它们是使用pragma自动链接的。在Linux上,你必须这样做。
根据文档,这些模块需要您获取或构建库:
答案 4 :(得分:1)
您需要添加以下库:
g++ -o file -lboost_system -lboost_filesystem sourcefile.cpp
如果您使用Makefile:
CC=gcc
CXX=g++
PROG = program
CXXFLAGS := -std=c++1y -g -Wall
LDFLAGS = -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu
LIBS= -lboost_system -lboost_filesystem
SRCS= main.cpp
OBJS=$(subst .cpp,.o,$(SRCS))
all: $(OBJS)
$(CXX) $(CXXFLAGS) -o $(PROG) $(OBJS) $(LIBS) $(LDFLAGS)