プロジェクトにBoost
ライブラリを含めようとしていますが、同じ問題が発生しています。私はUbuntu 12.10でCodeblocks IDEを使用し、サイトから指示を手動で読み取ってライブラリをインストールしようとしましたが、ヘッダーと使用前にビルドするライブラリでエラーが発生していました。
次に、terminalby Sudo apt-get install libboost-all-dev
経由でライブラリをインストールしました。この後、コードブロックのプログラムに#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のCodeblocksで)。ここで本当に助けを借りることができました。
コンパイラ:Gcc
プログラムコード:上記のファイルシステムoperations.hpp
ファイルのみを含めてみました。
Codeblocksからビルドログ:
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
libboost_system
ライブラリにリンクする必要があります。コードブロックについてはわかりませんが、プラットフォームのg ++コマンドラインオプションは
-lboost_system
ブーストバージョンに応じて、libboost-systemには、ライブラリのマルチスレッド機能を示す-mtサフィックスが付いています。
したがって、-lboost_system
がリンカーによって見つからない場合は、-lboost_system-mt
を試してください。
これはリンカーの問題です。静的ライブラリパスをプロジェクトに含めます。
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 ボタン。
私も解決策を探しましたが、このスレッドに対する「ViRuSTriNiTy」の答えが見つかるまで、遭遇した答えはエラーを解決しませんでした: ndefined reference to '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})
G ++コンパイラフラグを-std = c ++ 14から-std = c ++ 11に変更した後に解決された、単純なブーストサンプルの構築に関する同じ問題。
そして、私はそれがC++ 11の例であることに気付きました...
これは answer Boostとcmakeを使用するときに実際に役立ちました。
Cmakeファイルにadd_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
を追加します。
私の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()
私も同じ問題を抱えており、Linux Mint(nuduoz)を使用しています。 boost_system
をGCC C++ Linker->Libraries
に追加した後、私のケースの問題は解決しました。
別の問題に出くわす可能性があります。 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
詳細については、 this questionを参照してください。
試してみる
g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out
/usr/lib/x86_64-linux-gnu/
は、boostライブラリの場所です
find /usr/ -name '*boost*.so'
を使用して、ブーストライブラリの場所を見つけます
ライブラリがインストールされていない場合は、boostライブラリフォルダを指定する必要があります。
例:
g ++ -L/usr/lib/x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog
g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry
debianで完全に動作しました。 (apt-getでインストールされたc ++ライブラリのブースト)。
上記の提案されたソリューションをテストした後、これらの数行のみが機能することがわかりました。
Ubuntu 16.04を使用しています。
cmake_minimum_required(バージョン3.13)
project(myProject)
セット(CMAKE_CXX_STANDARD 11)
add_executable(myProject main.cpp)
find_package(Boost 1.58.0 REQUIRED COMPONENTSシステムファイルシステム)
target_link_libraries(myProject $ {Boost_LIBRARIES})