メモの日々


2015年04月17日(金) [長年日記]

[c++] CentOS 7でboost::filesystemをC++11モードで使うとリンクエラーになる

CentOS 7でboost::filesystemを使ったコードを --std=c++11 オプションを付けてコンパイルするとリンクエラーになってしまう。

% cat filesystem_test.cpp
#include <boost/filesystem.hpp>

int main() {
  boost::filesystem::path p;
  boost::filesystem::path pp;
  boost::filesystem::copy_file(p, pp);
}

% LANG=C g++ -Wall --std=c++11 filesystem_test.cpp -lboost_filesystem -lboost_system
/tmp/ccacbvHH.o: In function `boost::filesystem::copy_file(boost::filesystem::path const&, boost::filesystem::path const&)':
filesystem_test.cpp:(.text._ZN5boost10filesystem9copy_fileERKNS0_4pathES3_[_ZN5boost10filesystem9copy_fileERKNS0_4pathES3_]+0x26): undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

--std=c++11 ではなく --std=c++03 とすればエラーにならないけど、C++11を使いたい。Boostのバグが原因のようで、

にあるように

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

とincludeの前にマクロを定義すればコンパイルできた。