C ++ Boost:boost :: system :: generic_category()への未定義の参照


92

私はBoost自分のプロジェクトにライブラリを含めようとしていますが、同じ問題に直面しています。私はCodeblocksIDEを搭載したUbuntu12.10を使用しており、サイトからの指示を手動で読み取ってライブラリをインストールしようとしましたが、ヘッダーと使用前に構築されるライブラリでエラーが発生していました。

次に、terminalbyを介してライブラリをインストールしましたsudo apt-get install libboost-all-dev。この後、Codeblocksのプログラムに次のようなヘッダーを含めることができます#include <boost/regex.hpp>が、ファイルシステムライブラリ(#include "boost/filesystem/operations.hpp" )のヘッダーを含めようとすると、次のエラーが発生します。

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

このエラーを解決する方法がわかりません(特にLinuxのコードブロックで)。私は本当にここでいくつかの助けを使うことができました。

コンパイラ:Gcc
プログラムコード:上記のファイルシステムoperations.hppファイルのみを含めてみました。

コードブロックからログを作成します。

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings

あなたが正しくリンクしていないと、システムパスやシステムリポジトリとは異なり、
コード

@pyCthon:その場合、Code :: blocksでこれをリンクする方法についてさらに詳細を追加できますか?-lboost_system設定のどこかにリンカーフラグを追加しようとしましたが、解決しませんでした。ただし、リンカーフラグ全体を適切な場所で実行したかどうかさえわかりません。もう少し詳しく説明すると非常に役立ちます。
暗号

さて、どのコンパイラを使用していますか?mingw?gcc?どのコードを実行しようとしていますか?.....例を与える
pyCthon

@pyCthon:ComilerはGccです。私は今までコードを書いていませんが、Boost filesystem library(上記の投稿のoperation.hpp)を含めてみました
暗号

g ++のコマンドラインからブーストファイルシステムライブラリを使用して通常のプログラムをコンパイルすることはできますか?
pyCthon 2012年

回答:


141

libboost_systemライブラリにリンクする必要があります。コードブロックについてはよくわかりませんが、プラットフォームのg ++​​コマンドラインオプションは次のようになります。

-lboost_system


ただし、リンカーフラグが追加されていることはすでにわかりました。Codeblocksで機能させることができません。
暗号

@Cipherは、コードブロックによって実行されるビルドコマンドとリンクコマンドを取得できますか?
juanchopanza 2012年

@Cipher申し訳ありませんが、ペーストビンは作業中にブロックされています。後で確認できますが、数時間かかります。
juanchopanza 2012年

問題ない。投稿でも更新
暗号

私はCipherと同じ問題を抱えていますが、私の場合はboost /asio.hppを扱います。コンパイラを実行しようとすると、これらのエラーs1.directupload.net/images/130608/koyvqpdp.jpgが発生します。-lboost_systemを追加しようとすると、「lboost_systemが見つかりません」と表示されます。どうしたの?
ddacot 2013年

21

ブーストバージョンに応じて、libboost-systemには、ライブラリのマルチスレッド機能を示す-mtサフィックスが付いています。

したがって-lboost_system、リンカーで見つからない場合は、を試してください-lboost_system-mt


1
これらのブーストバージョンでは、実際のライブラリファイル名に-mtサフィックスが付いているため、機能します。
tssch

9

これはリンカーの問題です。プロジェクトに静的ライブラリパスを含めます。

Qt Creatorの場合、プロジェクトファイル.proを開き、次の行を追加します。

LIBS += -L<path for boost libraries in the system> -lboost_system

私の場合、Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

コードブロックの場合は、Settings->Compiler...->Linker[設定]タブを開き、次を追加します。

boost_system

リンクライブラリテキストウィジェットに移動し、OKボタンを押します。


7

私も解決策を探しましたが、このスレッドに対する「ViRuSTriNiTy」の答えが見つかるまで、遭遇した答えのどれもエラーを解決しませんでした:'boost :: system :: generic_category()'への未定義の参照?

その答えによると、cmakeファイルにこれらの行を追加してみてください:

find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
include_directories(... ${Boost_INCLUDE_DIRS})
link_directories(... ${Boost_LIBRARY_DIRS})
target_link_libraries(... ${Boost_LIBRARIES})

5

この答えは、Boostとcmakeを使用するときに実際に役立ちました。

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)cmakeファイルの追加。

私のCMakeLists.txtは次のようになります。

cmake_minimum_required(VERSION 3.12)
project(proj)

set(CMAKE_CXX_STANDARD 17)


set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")

set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")

set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")


include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})

set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)

add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
        processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
        meta_command.h terminal/terminal.cpp terminal/terminal.h)


if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
endif()

4

単純なブーストの例を作成する際の同じ問題。g++コンパイラフラグを-std = c ++ 14から-std = c ++ 11に変更した後に解決されました。

そして、それがC ++ 11の例であることに気づきました...


それで私の問題は解決しました。特にデフォルトのフラグを使用する場合は、コンパイル中に使用されるフラグを忘れがちです。
Filipe Calasans 2018年

3

私は同じ問題を抱えており、Linux Mint(nuduozとして)も使用しています。に追加boost_systemした後、ケースの問題は解決しましたGCC C++ Linker->Libraries


1

別の問題に遭遇する可能性があります。Linux MintにBoostをインストールした後、同じ問題が発生しました。ライブラリに名前が付いているため、リンクしている-lboost_systemか、機能し-lboost_system-mtていませんlibboost_system.so.1.54.0

したがって、解決策は、元のファイルへのシンボリックリンクを作成することです。私の場合

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

詳細については、この質問を参照してください。


1

ライブラリがインストールされていない場合は、ブーストライブラリフォルダを指定する必要があります。

例:

g ++ -L / usr / lib / x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog


0

試してみてください

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ ブーストライブラリの場所です

find /usr/ -name '*boost*.so'ブーストライブラリの場所を見つけるために使用する


0

g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

Debianの下で完全に機能しました。(apt-getでインストールされたブーストc ++ライブラリ)。


0

上記の提案されたソリューションをテストした後、私はこれらの数行だけが機能することを発見しました。

Ubuntu16.04を使用しています。

cmake_minimum_required(バージョン3.13)
プロジェクト(myProject)

set(CMAKE_CXX_STANDARD 11)
add_executable(myProject main.cpp)

find_package(Boost 1.58.0 REQUIRED COMPONENTSシステムファイルシステム)
target_link_libraries(myProject $ {Boost_LIBRARIES})

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.