C ++ Boost: referensi tidak ditentukan ke boost :: system :: generic_category ()

92

Saya mencoba untuk memasukkan Boostperpustakaan dalam proyek saya dan telah menghadapi masalah yang sama. Saya menggunakan Ubuntu 12.10 dengan Codeblocks IDE dan mencoba menginstal perpustakaan secara manual membaca instruksi dari situs, tetapi mendapatkan kesalahan dengan tajuk serta perpustakaan yang akan dibangun sebelum digunakan.

Saya kemudian menginstal perpustakaan melalui terminalby sudo apt-get install libboost-all-dev. Setelah ini, dalam program saya di Codeblocks, saya dapat menyertakan header seperti #include <boost/regex.hpp>tetapi ketika saya mencoba memasukkan header untuk perpustakaan Filesystem ( #include "boost/filesystem/operations.hpp" ), saya mendapatkan kesalahan berikut:

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

Saya tidak yakin bagaimana cara mengatasi kesalahan ini (khususnya di Codeblocks di Linux). Saya benar-benar membutuhkan bantuan di sini.

Kompiler: Gcc
Kode program: Hanya dicoba, termasuk file sistem operations.hppfile di atas.

Buat log dari 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
Sandi
sumber
Anda tidak menautkannya dengan benar, blok kode tidak akan melakukannya untuk Anda tidak seperti jalur sistem dan repositori sistem Anda,
pyCthon
@pyCthon: Dalam hal ini, dapatkah Anda menambahkan lebih banyak detail tentang cara menautkan ini di Code :: blok. Saya mencoba menambahkan bendera penaut -lboost_systemdi beberapa tempat di pengaturan, tetapi tidak berhasil. Namun, saya bahkan tidak yakin apakah saya melakukan seluruh hal bendera penaut di tempat yang tepat. Sedikit lebih banyak detail akan sangat membantu.
Cipher
nah kompiler apa yang kamu gunakan? mingw? gcc? kode apa yang Anda coba jalankan? berikan contoh .....
pyCthon
@pyCthon: Comiler adalah Gcc. Saya belum menulis kode apa pun sampai sekarang, tetapi telah mencoba termasuk Boost filesystem library(operation.hpp di posting di atas)
Cipher
cara kerja kompilasi program biasa dengan pustaka sistem file boost dari baris perintah dengan g ++?
pyCthon

Jawaban:

141

Anda harus menautkan di libboost_systemperpustakaan. Saya tidak yakin tentang blok kode, tetapi opsi baris perintah g ++ pada platform Anda adalah

-lboost_system

juanchopanza
sumber
Saya sudah menemukan bendera linker untuk ditambahkan. Tidak bisa membuatnya bekerja di Codeblocks.
Cipher
@Cipher Bisakah Anda mendapatkan perintah build dan link yang dijalankan oleh blok kode?
juanchopanza
@Cipher Maaf, pastebin diblokir di tempat kerja. Saya dapat memeriksanya nanti, tetapi akan memakan waktu beberapa jam.
juanchopanza
Tidak masalah. Diperbarui di pos juga
Cipher
saya memiliki masalah yang sama dengan Cipher, hanya dalam kasus saya, saya berurusan dengan boost / asio.hpp. Saya mendapatkan kesalahan ini s1.directupload.net/images/130608/koyvqpdp.jpg saat mencoba kompiler. Ketika saya mencoba menambahkan -lboost_system, dikatakan "tidak dapat menemukan lboost_system". Apa masalahnya?
ddacot
21

Bergantung pada versi boost, libboost-system dilengkapi dengan akhiran -mt yang seharusnya menunjukkan kemampuan multithreading perpustakaan.

Jadi jika -lboost_systemtidak dapat ditemukan oleh linker coba -lboost_system-mt.

tssch
sumber
1
Ini berfungsi karena untuk versi peningkatan ini, nama file perpustakaan sebenarnya memiliki -mtakhiran.
tssch
9

Ini masalah penaut. Sertakan jalur perpustakaan statis ke dalam proyek Anda.

Untuk Qt Creator buka file proyek .prodan tambahkan baris berikut:

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

Dalam kasus saya Ubuntu x86_64:

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

Untuk Codeblocks, buka Settings->Compiler...->Linkertab pengaturan dan tambahkan:

boost_system

ke widget teks Link libraries dan tekan OKtombol.

GLR
sumber
7

Saya mencari solusi juga, dan tidak ada jawaban yang saya temui memecahkan kesalahan tersebut, Sampai saya menemukan jawaban "ViRuSTriNiTy" untuk utas ini: Referensi tidak ditentukan ke 'boost :: system :: generic_category ()'?

menurut jawaban itu, coba tambahkan baris ini ke file cmake Anda:

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})
SubMachine
sumber
5

Jawaban ini sebenarnya membantu saat menggunakan Boost dan cmake.

Menambahkan add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)untuk file cmake.

CMakeLists.txt saya terlihat seperti ini:

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()
sdd
sumber
4

Masalah yang sama saat membuat contoh boost sederhana, diselesaikan setelah saya mengubah flag compiler g ++ dari -std = c ++ 14 menjadi -std = c ++ 11 .

Dan saya perhatikan bahwa itu adalah Contoh C ++ 11 ...

Halowb
sumber
Itu memecahkan masalah saya. Sangat mudah untuk melupakan flag yang digunakan selama kompilasi, khususnya jika Anda menggunakan yang default.
Filipe Calasans
3

Saya memiliki masalah yang sama dan juga menggunakan Linux Mint (sebagai nuduoz). Saya masalah kasus saya terpecahkan setelah saya menambahkan boost_systemke GCC C++ Linker->Libraries.

piotr93
sumber
1

Anda bisa menemukan masalah lain. Setelah menginstal Boost di Linux Mint, saya mengalami masalah yang sama. Menautkan -lboost_systematau -lboost_system-mttidak berfungsi karena perpustakaan memiliki nama libboost_system.so.1.54.0.

Jadi solusinya adalah membuat tautan simbolis ke file asli. Dalam kasus saya

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

Untuk informasi lebih lanjut, lihat pertanyaan ini .

nuduoz
sumber
1

Jika perpustakaan tidak diinstal, Anda harus memberikan folder perpustakaan dorongan:

contoh:

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

Majukarma
sumber
0

mencoba

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

/usr/lib/x86_64-linux-gnu/ adalah lokasi pustaka boost

gunakan find /usr/ -name '*boost*.so'untuk menemukan lokasi perpustakaan pendorong

algometrix
sumber
0

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

bekerja dengan sempurna di bawah debian. (tingkatkan pustaka c ++ yang diinstal dengan apt-get).

majukarma
sumber
0

Setelah menguji solusi yang diusulkan yang dijelaskan di atas, saya menemukan hanya beberapa baris ini yang akan berfungsi.

Saya menggunakan Ubuntu 16.04.

cmake_minimum_required (VERSION 3.13)
proyek (myProject)

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

find_package (Meningkatkan 1.58.0 KOMPONEN YANG DIPERLUKAN sistem file sistem)
target_link_libraries (myProject $ {Boost_LIBRARY})

Alan Yang
sumber