C ++ Boost: การอ้างอิงที่ไม่ได้กำหนดเพื่อ boost :: system :: generic_category ()


92

ฉันพยายามรวมBoostไลบรารีไว้ในโครงการของฉันและประสบปัญหาในเรื่องเดียวกัน ฉันใช้ Ubuntu 12.10 พร้อม Codeblocks IDE และลองติดตั้งไลบรารีด้วยตนเองเพื่ออ่านคำแนะนำจากไซต์ แต่ได้รับข้อผิดพลาดพร้อมส่วนหัวและไลบรารีที่ต้องสร้างก่อนใช้

ฉันติดตั้งไลบรารีผ่านเทอร์มินัลบี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()'|

ฉันไม่แน่ใจว่าจะแก้ไขข้อผิดพลาดนี้อย่างไร (โดยเฉพาะใน Codeblocks บน Linux) ฉันสามารถใช้ความช่วยเหลือได้ที่นี่

Gcc: คอมไพเลอร์
รหัสโปรแกรม: พยายามเท่านั้น inlcuding ระบบไฟล์ดังกล่าวข้างต้น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

คุณไม่ได้เชื่อมโยงอย่างถูกต้อง codeblocks จะไม่ทำเพื่อคุณซึ่งแตกต่างจากเส้นทางระบบและที่เก็บระบบของคุณ
pyCthon

@pyCthon: ในกรณีนี้คุณสามารถเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการเชื่อมโยงสิ่งนี้ใน Code :: blocks ฉันพยายามเพิ่มค่าสถานะตัวเชื่อมโยง-lboost_systemในบางตำแหน่งในการตั้งค่า แต่ไม่สามารถแก้ไขได้ อย่างไรก็ตามฉันไม่แน่ใจด้วยซ้ำว่าได้ตั้งค่าสถานะตัวเชื่อมโยงทั้งหมดในสถานที่ที่ถูกต้องหรือไม่ รายละเอียดเพิ่มเติมเล็กน้อยจะช่วยได้มาก
Cipher

คุณใช้คอมไพเลอร์อะไร มิ้ว? gcc? คุณพยายามรันโค้ดอะไร ยกตัวอย่าง .....
pyCthon

@pyCthon: Comiler คือ Gcc ฉันยังไม่ได้เขียนโค้ดใด ๆ จนถึงตอนนี้ แต่ได้ลองรวมBoost filesystem library(operation.hpp ในโพสต์ด้านบน)
Cipher

มันทำงานร่วมกับโปรแกรมปกติที่มีไลบรารีระบบไฟล์บูสต์จากบรรทัดคำสั่งด้วย g ++ หรือไม่
pyCthon

คำตอบ:


141

คุณควรเชื่อมโยงในlibboost_systemไลบรารี ฉันไม่แน่ใจเกี่ยวกับ codeblocks แต่ตัวเลือกบรรทัดคำสั่ง g ++ บนแพลตฟอร์มของคุณจะเป็น

-lboost_system


ฉันพบแฟล็กตัวเชื่อมโยงที่จะเพิ่มแล้ว ไม่สามารถใช้งานได้ใน Codeblocks
Cipher

@Cipher คุณสามารถรับคำสั่ง build และ link ที่ดำเนินการโดย codeblocks ได้หรือไม่?
juanchopanza

@Cipher ขออภัย Pastebin ถูกบล็อกในที่ทำงาน ฉันสามารถตรวจสอบได้ในภายหลัง แต่จะใช้เวลาสองสามชั่วโมง
juanchopanza

ไม่มีปัญหา. อัปเดตในโพสต์เช่นกัน
Cipher

ฉันมีปัญหาเดียวกันกับ Cipher ในกรณีของฉันฉันจัดการกับ boost / asio.hpp ฉันได้รับข้อผิดพลาดเหล่านี้s1.directupload.net/images/130608/koyvqpdp.jpgเมื่อพยายามคอมไพเลอร์ เมื่อฉันพยายามเพิ่ม -lboost_system มันขึ้นว่า "ไม่พบ lboost_system" มีปัญหาอะไร?
ddacot

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

สำหรับ Codeblocks ให้เปิดSettings->Compiler...->Linkerแท็บการตั้งค่าและเพิ่ม:

boost_system

ไปยังวิดเจ็ตข้อความลิงก์ไลบรารีแล้วกดOKปุ่ม


7

ฉันค้นหาวิธีแก้ปัญหาเช่นกันและไม่มีคำตอบใดที่พบในการแก้ไขข้อผิดพลาดจนกว่าฉันจะพบคำตอบของ "ViRuSTriNiTy" สำหรับหัวข้อนี้: Undefined 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})

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

ปัญหาเดียวกันในการสร้างตัวอย่างที่เพิ่มง่ายแก้ไขได้หลังจากที่ผมเปลี่ยนกรัม ++ คอมไพเลอร์ธงจาก-std = C ++ 14เพื่อ-std = C ++ 11

และฉันสังเกตเห็นว่ามันเป็นตัวอย่าง C ++ 11 ...


นั่นช่วยแก้ปัญหาของฉันได้ มันค่อนข้างง่ายที่จะลืมแฟล็กที่ใช้ระหว่างการคอมไพล์โดยเฉพาะเมื่อคุณใช้แฟล็กเริ่มต้น
Filipe Calasans

3

ฉันมีปัญหาเดียวกันและใช้ Linux Mint (เป็น nuduoz) ฉันปัญหากรณีของฉันถูกแก้ไขหลังจากที่ฉันเพิ่มไปboost_systemGCC C++ Linker->Libraries


1

คุณอาจเจอปัญหาอื่น หลังจากติดตั้ง Boost บน Linux Mint ฉันมีปัญหาเดียวกัน การเชื่อมโยง-lboost_systemหรือไม่ได้ทำงานเพราะห้องสมุดมีชื่อ-lboost_system-mtlibboost_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

Il ไม่ได้ติดตั้งไลบรารีคุณควรให้โฟลเดอร์ boost libraries:

ตัวอย่าง:

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

ทำงานได้อย่างสมบูรณ์ภายใต้เดเบียน (เพิ่มไลบรารี c ++ ที่ติดตั้งด้วย apt-get)


0

หลังจากทดสอบโซลูชันที่เสนอตามที่อธิบายไว้ข้างต้นฉันพบว่ามีเพียงไม่กี่บรรทัดเท่านั้นที่ใช้งานได้

ฉันใช้ Ubuntu 16.04

cmake_minimum_required (VERSION 3.13)
โครงการ (myProject)

ชุด (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.