การอ้างอิงที่ไม่ได้กำหนดเพื่อ boost :: system :: system_category () เมื่อคอมไพล์


105

ฉันกำลังพยายามรวบรวมโปรแกรมบน Ubuntu 11.10 ที่ใช้ไลบรารี Boost ฉันมีไลบรารี Boost 1.46-dev จาก Ubuntu Repository ที่ติดตั้งไว้ แต่ฉันได้รับข้อผิดพลาดเมื่อรวบรวมโปรแกรม

undefined reference to boost::system::system_category()

ฉันทำอะไรผิด?


6
ที่ไม่ได้รวบรวมข้อผิดพลาดก็เป็นตัวเชื่อมโยงข้อผิดพลาด คุณต้องเชื่อมโยงกับไลบรารี Boost.System
ildjarn

คำตอบ:


160

ไลบรารีบูสต์ที่คุณใช้ขึ้นอยู่กับไลบรารี boost_system (ไม่ใช่ทั้งหมดที่ทำ)

สมมติว่าคุณใช้ gcc ให้ลองเพิ่ม-lboost_systemในบรรทัดคำสั่งคอมไพเลอร์ของคุณเพื่อเชื่อมโยงกับไลบรารีนั้น


3
ฉันใช้ g ++ Makefile สำหรับการคอมไพล์ ใครมักจะวางธงดังกล่าว?
user1049697

2
วิธีการประกอบบรรทัดคำสั่งคอมไพลเลอร์ / ลิงค์เกอร์แตกต่างกันอย่างมากในแต่ละกรณี ทำไมคุณไม่วาง Makefile (หรือส่วนที่เกี่ยวข้อง) ลงในคำถามของคุณ ด้วยวิธีนี้คุณจะได้รับคำตอบที่เหมาะกับกรณีของคุณ
hc_

7
ตกลงฉันแก้ไข Makefile.am และเพิ่ม-lboost_systemแล้วมันก็เลยเป็นแบบนี้: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system. มันไม่ได้ช่วยอะไรเลย ...
user1049697

1
ยังคงเป็นข้อผิดพลาดเดิมหรือไม่ autoreconfหลังจากนั้นคุณวิ่งหรือไม่? นอกจากนี้โพสต์นี้และโพสต์นี้อาจช่วยคุณในการกำหนดค่าเครื่องมืออัตโนมัติของคุณ
hc_

2
ฉันแทนที่sslsniff_LDFLAGSด้วยsslsniff_LDADDMakefile.am และไม่ได้ผล แล้วฉันจะเก็บไว้ทั้งสองและเพิ่มsslsniff_LDFLAGS sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cppจากนั้นฉันก็สามารถรวบรวม ขอขอบคุณสำหรับความช่วยเหลือ!
user1049697

62

การเชื่อมโยงกับห้องสมุดที่กำหนดสัญลักษณ์ที่หายไป (ก-lboost_system) เป็นวิธีการแก้ปัญหาที่ชัดเจน แต่ในกรณีพิเศษของ Boost.System เป็น misfeature ในการออกแบบเดิมทำให้ใช้boost::system::generic_category()และboost::system::system_category()ไม่มีความจำเป็น การคอมไพล์ด้วยแฟ-DBOOST_SYSTEM_NO_DEPRECATEDล็กจะปิดใช้งานโค้ดนั้นและอนุญาตให้โปรแกรมจำนวนหนึ่งคอมไพล์โดยไม่ต้องใช้-lboost_system(แน่นอนว่ายังจำเป็นต้องใช้ลิงก์นั้นหากคุณใช้คุณสมบัติบางอย่างของไลบรารีอย่างชัดเจน)

เริ่มจาก Boost 1.66 และการกระทำนี้พฤติกรรมนี้เป็นค่าเริ่มต้นดังนั้นหวังว่าผู้ใช้จะน้อยลงและต้องการคำตอบนี้

ตามที่สังเกตเห็นโดย @AndrewMarshall อีกทางเลือกหนึ่งคือการกำหนดBOOST_ERROR_CODE_HEADER_ONLYว่าจะเปิดใช้งานโค้ดเวอร์ชันส่วนหัวเท่านั้น สิ่งนี้ไม่ได้รับการสนับสนุนจาก Boost เนื่องจากสามารถทำลายฟังก์ชันการทำงานบางอย่างได้ อย่างไรก็ตามตั้งแต่ 1.69 ดูเหมือนว่าส่วนหัวอย่างเดียวจะกลายเป็นค่าเริ่มต้นซึ่งคาดว่าจะทำให้คำถามนี้ล้าสมัย


4
ขอบคุณ !!! ไม่มีอะไรช่วยได้ตั้งแต่ฉันใช้ boost 1.41 (Centos SL) สิ่งเดียวที่ทำให้ฉันเป็นอิสระคือใช้ -DBOOST_SYSTEM_NO_DEPRECATED
Roger Rabbit

5
จริงๆแล้วสิ่งที่คุณต้องการคือ -DBOOST_ERROR_CODE_HEADER_ONLY
Andrew Marshall

1
ที่น่าสนใจคือพฤติกรรม Boost 1.66 ใหม่ของการมีการอ้างอิงถึง system_category () และอื่น ๆน้อยลงอาจทำให้เกิดปัญหาลิงก์ใหม่เมื่อมีปัญหาการสั่งซื้อลิงก์ ดูgithub.com/PointCloudLibrary/pcl/pull/2236เช่น
pixelbeat

3
หากคุณใช้ CMake เพียงแค่เพิ่ม 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)'
nickolay

1
คงเพียง แต่ที่ทำงานให้ฉันกับ Boost 1.68 BOOST_ERROR_CODE_HEADER_ONLYคือการกำหนด
sakra

17

วิธีแก้ปัญหาอื่นสำหรับผู้ที่ไม่ต้องการ shebang ทั้งหมด: ใช้สวิตช์

-DBOOST_ERROR_CODE_HEADER_ONLY.

ถ้าคุณใช้ CMake add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)ก็


1
ฉันเพิ่งเจอปัญหานี้ ไม่มีอะไรทำงานได้ยกเว้นอันนี้ ฉันสงสัยว่าสิ่งนี้ยังคงท้อใจกับการเพิ่มดังที่กล่าวไว้ในคำตอบของ Marc Glisse หรือไม่
John Z. Li

1
อ้างว่า "Boost.System เป็นส่วนหัวเท่านั้น แต่ยังคงสร้าง Stub library สำหรับความเข้ากันได้ แต่ไม่จำเป็นต้องเชื่อมโยงไปยังระบบอีกต่อไป"
John Z. Li

16

ข้อผิดพลาดข้างต้นเป็นข้อผิดพลาดของตัวเชื่อมโยง ... ตัวเชื่อมโยงโปรแกรมที่ใช้วัตถุอย่างน้อยหนึ่งชิ้นที่สร้างโดยคอมไพเลอร์และรวมเข้าไว้ในโปรแกรมปฏิบัติการเดียว

คุณต้องเพิ่ม-lboost_systemให้คุณลิงเกอร์ธงซึ่งบ่งชี้ว่าการลิงเกอร์ที่ว่ามันต้องมองหาสัญลักษณ์เช่นในห้องสมุดboost::system::system_category()libboost_system.so

หากคุณมี main.cpp ให้ทำดังนี้

g++ main.cpp -o main -lboost_system

หรือ

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
ช่องว่างระหว่าง -l และชื่อไลบรารีไม่ถูกต้อง คุณควรใช้ -lboost_system
portforwardpodcast

1
ฉันพบว่า centos ไม่ได้สนใจเกี่ยวกับตำแหน่งของ -l แต่ ubuntu ทำต้องอยู่ในตอนท้าย
ask_io

7

เมื่อใช้ CMAKE และ find_package ตรวจสอบให้แน่ใจว่าเป็น:

find_package(Boost COMPONENTS system ...)

และไม่

find_package(boost COMPONENTS system ...)

บางคนอาจเสียเวลาไปหลายชั่วโมง ...


6

ฉันมีปัญหาเดียวกัน:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(. text + 0x54): ไม่ได้กำหนดการอ้างอิงถึง `boost :: system :: generic_category ()

วิธีแก้ไขคือใช้เวอร์ชันดีบักของ system-lib:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

แต่ทำไม?


1
เป็นไปได้ไหมว่าบางแห่งมีการกำหนดแฟล็กการดีบักดังนั้นคุณจึงมี libs อื่น ๆ ที่สร้างขึ้นใน debug หรือ g ++ กำลังสร้าง debug obj?
noonex

4

เมื่อฉันมีปัญหานี้สาเหตุคือการสั่งซื้อของห้องสมุด ในการแก้ไขฉันใส่libboost_systemสุดท้าย:

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

นี่คือการ mingw กับ gcc 5.3 และเพิ่ม 1.61.0 ด้วยตัวอย่างตัวจับเวลาง่ายๆ


1
นี่เป็นปัญหาของฉันเหมือนกัน ฉันรวมไว้ผ่าน CMake และไม่ว่าด้วยเหตุผลใดก็ตามการอ้างอิงและการสั่งซื้อที่ถือว่าได้รับการทำงานในสคริปต์ FindBoost จริงๆแล้วปัญหาของฉันคือการใช้ไลบรารีที่ใช้ร่วมกันเสมอและไม่เคยให้ความสนใจจากนั้นย้ายไปที่ไลบรารีแบบคงที่และได้รับข้อผิดพลาดในการสร้าง อ๊ะ.
Anthony

สิ่งนี้แก้ไขให้ฉันเช่นกัน ... ก่อนหน้านี้ของโซลูชันนี้สิ่งเดียวที่ได้ผลคือการกำหนด BOOST_ERROR_CODE_HEADER_ONLY บน Ubuntu 18.04 เพิ่ม 1.68 ด้วย cmake การแก้ไขของฉัน: target_link_libraries (ปฏิบัติการ pthread ssl crypto boost_system)
Luis

2

ในกรณีของฉันการเพิ่ม-lboost_systemไม่เพียงพอ แต่ยังไม่พบในสภาพแวดล้อมการสร้างแบบกำหนดเองของฉัน ฉันต้องใช้คำแนะนำที่กำจัด "gcc - / usr / bin / ld: ไม่พบคำเตือน lib"และเปลี่ยน./configureคำสั่งเป็น:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่Boost 1.51: "error: can't link กับ boost_thread!"


1

... และในกรณีที่คุณต้องการเชื่อมโยงหลักแบบคงที่ใน Jamfile ของคุณให้เพิ่มสิ่งต่อไปนี้ในข้อกำหนด:

<link>static
<library>/boost/system//boost_system

และอาจจะ:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.