Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't link program using Boost.Filesystem

Tags:

I'm trying to run program, using sample code of boost::filesystem on Ubuntu 12.10, but it doesn't want to build.

#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"; } 

And CMake code:

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}) 

Unfortunately it generates errors

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 

What is the reason of this problem and how to solve it?

like image 698
adashie Avatar asked Mar 26 '13 09:03

adashie


1 Answers

Boost filesystem is one of the Boost library that have some ABI problem relative to function signature change due to C++0x or C++11. cf Boost ticket : https://svn.boost.org/trac/boost/ticket/6779

You have three solutions:

  1. Inhibit C++11 scoped enums in concerned Boost header files included in your programs with #include (cf http://www.ridgesolutions.ie/index.php/2013/05/30/boost-link-error-undefined-reference-to-boostfilesystemdetailcopy_file/):

    #define BOOST_NO_CXX11_SCOPED_ENUMS #include <boost/filesystem.hpp> #undef BOOST_NO_CXX11_SCOPED_ENUMS 

    But this solution is not a complete one and I read it does not work for everybody.

  2. Build BOOST with the C++11 option (the same options you use for your application): http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide

    I read also it does not work for everybody.

  3. Set up a cross compiler dedicated to your application where you rebuild all the libraries you need in a dedicated environment. That ensures coherence plus stability plus more maintainability, and is certainly the solution to recommend. I have not read if it has been tested - probably yes, and probably it works. Anyway, cross compiling is well mastered now in computer science. You will find many good tutorials and support for it. In Linux Gentoo, they have the marvelous sys-devel/crossdev package that makes it very easy.

In my own case, solution 1 has solved the problem. As soon as I encounter another one, I will switch to solution 3. So, I have not yet tested it.

like image 64
lalebarde Avatar answered Sep 22 '22 22:09

lalebarde