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の前にマクロを定義すればコンパイルできた。