ฉันกำลังพยายามรวบรวมโปรแกรมบน Ubuntu 11.10 ที่ใช้ไลบรารี Boost ฉันมีไลบรารี Boost 1.46-dev จาก Ubuntu Repository ที่ติดตั้งไว้ แต่ฉันได้รับข้อผิดพลาดเมื่อรวบรวมโปรแกรม
undefined reference to boost::system::system_category()
ฉันทำอะไรผิด?
ฉันกำลังพยายามรวบรวมโปรแกรมบน Ubuntu 11.10 ที่ใช้ไลบรารี Boost ฉันมีไลบรารี Boost 1.46-dev จาก Ubuntu Repository ที่ติดตั้งไว้ แต่ฉันได้รับข้อผิดพลาดเมื่อรวบรวมโปรแกรม
undefined reference to boost::system::system_category()
ฉันทำอะไรผิด?
คำตอบ:
ไลบรารีบูสต์ที่คุณใช้ขึ้นอยู่กับไลบรารี boost_system (ไม่ใช่ทั้งหมดที่ทำ)
สมมติว่าคุณใช้ gcc ให้ลองเพิ่ม-lboost_system
ในบรรทัดคำสั่งคอมไพเลอร์ของคุณเพื่อเชื่อมโยงกับไลบรารีนั้น
-lboost_system
แล้วมันก็เลยเป็นแบบนี้: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system
. มันไม่ได้ช่วยอะไรเลย ...
autoreconf
หลังจากนั้นคุณวิ่งหรือไม่? นอกจากนี้โพสต์นี้และโพสต์นี้อาจช่วยคุณในการกำหนดค่าเครื่องมืออัตโนมัติของคุณ
sslsniff_LDFLAGS
ด้วยsslsniff_LDADD
Makefile.am และไม่ได้ผล แล้วฉันจะเก็บไว้ทั้งสองและเพิ่มsslsniff_LDFLAGS
sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp
จากนั้นฉันก็สามารถรวบรวม ขอขอบคุณสำหรับความช่วยเหลือ!
การเชื่อมโยงกับห้องสมุดที่กำหนดสัญลักษณ์ที่หายไป (ก-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 ดูเหมือนว่าส่วนหัวอย่างเดียวจะกลายเป็นค่าเริ่มต้นซึ่งคาดว่าจะทำให้คำถามนี้ล้าสมัย
BOOST_ERROR_CODE_HEADER_ONLY
คือการกำหนด
วิธีแก้ปัญหาอื่นสำหรับผู้ที่ไม่ต้องการ shebang ทั้งหมด: ใช้สวิตช์
-DBOOST_ERROR_CODE_HEADER_ONLY
.
ถ้าคุณใช้ CMake add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
ก็
ข้อผิดพลาดข้างต้นเป็นข้อผิดพลาดของตัวเชื่อมโยง ... ตัวเชื่อมโยงโปรแกรมที่ใช้วัตถุอย่างน้อยหนึ่งชิ้นที่สร้างโดยคอมไพเลอร์และรวมเข้าไว้ในโปรแกรมปฏิบัติการเดียว
คุณต้องเพิ่ม-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
เมื่อใช้ CMAKE และ find_package ตรวจสอบให้แน่ใจว่าเป็น:
find_package(Boost COMPONENTS system ...)
และไม่
find_package(boost COMPONENTS system ...)
บางคนอาจเสียเวลาไปหลายชั่วโมง ...
ฉันมีปัญหาเดียวกัน:
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
แต่ทำไม?
เมื่อฉันมีปัญหานี้สาเหตุคือการสั่งซื้อของห้องสมุด ในการแก้ไขฉันใส่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 ด้วยตัวอย่างตัวจับเวลาง่ายๆ
ในกรณีของฉันการเพิ่ม-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!"
... และในกรณีที่คุณต้องการเชื่อมโยงหลักแบบคงที่ใน Jamfile ของคุณให้เพิ่มสิ่งต่อไปนี้ในข้อกำหนด:
<link>static
<library>/boost/system//boost_system
และอาจจะ:
<linkflags>-static-libgcc
<linkflags>-static-libstdc++