23

Ubuntu12.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

この問題の理由とその解決方法は何ですか?

4

5 に答える 5

28

Boostファイルシステムは、C++0xまたはC++11による関数シグネチャの変更に関連するABIの問題があるBoostライブラリの1つです。ブーストチケットを参照:https ://svn.boost.org/trac/boost/ticket/6779

3つの解決策があります。

  1. プログラムに含まれる関連するBoostヘッダーファイルのC++11スコープの列挙型を#includeで禁止します(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
    

    しかし、この解決策は完全なものではなく、私はそれがすべての人に役立つわけではないことを読みました。

  2. C ++ 11オプション(アプリケーションで使用するのと同じオプション)を使用してBOOSTをビルドします:http://hnrkptrsn.github.io/2013/02/26/c11-and-boost-setup-guide

    私はまたそれが皆のために働くわけではないことを読みました。

  3. アプリケーション専用のクロスコンパイラをセットアップし、専用環境で必要なすべてのライブラリを再構築します。これにより、一貫性と安定性に加えて保守性が向上し、確実に推奨されるソリューションになります。私はそれがテストされているかどうかを読んでいません-おそらくそうです、そしておそらくそれは動作します。とにかく、クロスコンパイルは現在コンピュータサイエンスでよく習得されています。あなたは多くの良いチュートリアルとそれのサポートを見つけるでしょう。Linux Gentooには、非常に簡単な素晴らしいsys-devel/crossdevパッケージがあります。

私自身の場合、解決策1で問題が解決しました。別の問題に遭遇したらすぐに、ソリューション3に切り替えます。したがって、まだテストしていません。

于 2013-08-01T08:01:48.220 に答える
9

リンクするときにlibboost_filesystemライブラリを追加する必要があります。または、アプリケーションがマルチスレッドの場合はlibboost_filesystem-mt。このような:

g++ -o file -lboost_filesystem-mt source_file.cpp
于 2013-08-19T09:29:22.150 に答える
3

私のために働いた解決策は、「-c」でコンパイルしてから、次のような実行可能ファイルを作成することです。

g++ -c -o main.o main.cpp
g++ -o my_prog main.o -lboost_system -lboost_filesystem
于 2018-03-15T23:23:50.153 に答える
1

一部のブーストモジュールでは、ライブラリをコンパイルしてリンクする必要があります(bootstrap.shを使用)。あなたの場合、あなたはコンパイルしてリンクしなければなりませんFilesystem、そしておそらくまたSystem

こちらをご覧ください

例えば:

  • ./bootstrap.sh(bjam)
  • rm -rf bin.v2ステージ(2つのbjamコマンド間)
  • ./bjamリリースツールセット=gccアドレス-モデル=64cxxflags= -fPIC
  • ./bjam debug toolset = gcc address-model = 64 cxxflags = -fPIC

Windowsでリンクしている場合、ライブラリはプラグマを使用して自動的にリンクされるため、手動でリンクする必要はありません。Linuxでは、それをしなければなりません。

ドキュメントによると、これらのモジュールでは、ライブラリを取得または構築する必要があります。

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Wave
于 2013-03-26T10:08:17.883 に答える
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)
于 2017-01-14T17:19:19.610 に答える