সংকলন করার সময় বুস্ট :: সিস্টেম :: সিস্টেম_কোটাগারি () এর অপরিজ্ঞাত রেফারেন্স


105

আমি উবুন্টু ১১.১০ তে একটি প্রোগ্রাম সংকলন করার চেষ্টা করছি যা বুস্ট লাইব্রেরি ব্যবহার করে। আমার উবুন্টু সংগ্রহশালা থেকে 1.46-দেব বুস্ট লাইব্রেরি ইনস্টল করা আছে তবে প্রোগ্রামটি সংকলন করার সময় আমি একটি ত্রুটি পেয়েছি।

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

আমি কী ভুল করছি?


6
এটি কোনও সংকলক ত্রুটি নয়, এটি একটি লিঙ্কারের ত্রুটি। আপনাকে বুস্ট.সিস্টেম লাইব্রেরিতে লিঙ্ক করতে হবে।
iljarn

উত্তর:


160

আপনি যে বুস্ট লাইব্রেরিটি ব্যবহার করছেন তা বুস্ট_সিস্টেম লাইব্রেরির উপর নির্ভর করে। (তাদের সবাই করে না।)

ধরে নিই যে আপনি জিসিসি ব্যবহার করছেন, -lboost_systemসেই লাইব্রেরির সাথে লিঙ্ক করার জন্য আপনার সংকলক কমান্ড লাইনে যুক্ত করার চেষ্টা করুন ।


3
সংকলনের জন্য আমি একটি জি ++ মেকফিল ব্যবহার করছি। একজন সাধারণত এই জাতীয় পতাকা কোথায় রাখে?
ব্যবহারকারী 1049697

2
সংকলক / লিঙ্কার কমান্ড লাইনটি কীভাবে একত্রিত হয় তা কেস-কেস থেকে পৃথক হয়ে থাকে। আপনি আপনার প্রশ্নে নিজের মেকফিলটি (বা এর সম্পর্কিত অংশগুলি) পেস্ট করবেন না কেন? এইভাবে, আপনি একটি উত্তর পেতে পারেন যা আপনার নির্দিষ্ট ক্ষেত্রে কাজ করে।
এইচসি_

7
ঠিক আছে, আমি Makefile.am সম্পাদিত এবং যোগ -lboost_system, তাই এটি দেখতে এমন ছিল: sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system। যদিও এটি সাহায্য করে নি ...
ব্যবহারকারীর 1049697

1
তবুও একই ত্রুটি? তুমি কি autoreconfপরে দৌড়ালে ? এছাড়াও, এই পোস্টটি এবং এটি আপনাকে নিজের অটটুল কনফিগারেশনে সহায়তা করতে পারে।
এইচসি_

2
আমি প্রতিস্থাপিত sslsniff_LDFLAGSসঙ্গে sslsniff_LDADDMakefile.am এবং কাজ করে নি। তারপর আমি উভয় রাখা sslsniff_LDFLAGSএবং যোগ sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp। তারপরে আমি সংকলন করতে সক্ষম হয়েছি। সাহায্যের জন্য ধন্যবাদ!
ব্যবহারকারী 1049697

62

নিখোঁজ প্রতীকটি নির্ধারণ করে এমন একটি লাইব্রেরির সাথে সংযোগ স্থাপন -lboost_systemপ্রকট সমাধান, তবে বুস্ট.সিস্টেমের বিশেষ ক্ষেত্রে, মূল নকশায় একটি অপ্রয়োজনীয় বৈশিষ্ট্য এটিকে ব্যবহার boost::system::generic_category()এবং boost::system::system_category()অপ্রয়োজনীয় করে তোলে । পতাকাটির সাথে -DBOOST_SYSTEM_NO_DEPRECATEDসংকলন করা কোডটি অক্ষম করে এবং বেশ কয়েকটি প্রোগ্রামকে প্রয়োজনীয়তা ছাড়াই সংকলন করতে দেয় -lboost_system(আপনি যদি গ্রন্থাগারের কিছু বৈশিষ্ট্য স্পষ্টভাবে ব্যবহার করেন তবে সেই লিঙ্কটি অবশ্যই প্রয়োজন)।

বুস্ট ১.66। থেকে শুরু করে এবং এই প্রতিশ্রুতিবদ্ধভাবে , এই আচরণটি এখন ডিফল্ট, সুতরাং আশা করি কম এবং কম ব্যবহারকারীদের এই উত্তরটির প্রয়োজন হবে।

@ অ্যান্ড্রুমারশাল দ্বারা চিহ্নিত হিসাবে, একটি বিকল্প হ'ল কোডের BOOST_ERROR_CODE_HEADER_ONLYশিরোনাম-সংস্করণকে সক্ষম করে এমন সংজ্ঞা দেওয়া হয় । এটি বুস্ট দ্বারা নিরুৎসাহিত হয়েছিল কারণ এটি কিছু কার্যকারিতা ভঙ্গ করতে পারে। যাইহোক, ১.69৯ সাল থেকে শিরোনামটি কেবল ডিফল্ট হয়ে গেছে বলে মনে করা হচ্ছে , এই প্রশ্নটি অচল করে দেওয়া হয়েছে।


4
ধন্যবাদ !!! যেহেতু আমি 1.41 (সেন্টোস এসএল) কেবলমাত্র আমাকে মুক্তি দিয়েছিল তা ব্যবহার করে কোনও কিছুই সাহায্য করেনি -DBOOST_SYSTEM_NO_DEPRECATED
রজার খরগোশ

5
আসলে আপনি যা যা চাইতে পারেন তা হ'ল
অ্যান্ড্রু মার্শাল

1
মজার বিষয় হল system_category () ইত্যাদির কম রেফারেন্স থাকার নতুন বুস্ট 1.66 আচরণ লিংক ক্রম সংক্রান্ত সমস্যাগুলির উপস্থিতিতে নতুন লিঙ্কের সমস্যাগুলি প্রবর্তন করতে পারে । উদাহরণস্বরূপ github.com/PointCloudLibrary/pcl/pull/2236 দেখুন
পিক্সেলবিট

3
আপনি যদি সিএমকে ব্যবহার করেন তবে 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY)' যুক্ত করুন
নিকোলে

1
বুস্ট 1.68 নিয়ে আমার পক্ষে কাজ করা একমাত্র স্থির সংজ্ঞা ছিল BOOST_ERROR_CODE_HEADER_ONLY
সাকরা

17

যাদের পুরো শেবাংয়ের প্রয়োজন নেই তাদের জন্য আর একটি কাজ: স্যুইচটি ব্যবহার করুন

-DBOOST_ERROR_CODE_HEADER_ONLY

আপনি যদি সিএমকে ব্যবহার করেন তবে এটি add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)


1
আমি সম্প্রতি এই সমস্যা জুড়ে এসেছি। এটি ব্যতীত আর কিছুই কাজ করে না। আমি আশ্চর্য হই যে মার্ক গ্লিসের উত্তরে উল্লিখিত বর্ণনার দ্বারা এটিকে এখনও নিরুৎসাহিত করা হয় কিনা।
জন জেড। লি

1
উদ্ধৃতি "বুস্ট.সিস্টেমটি এখন কেবলমাত্র শিরোলেখ। একটি স্টাব লাইব্রেরিটি এখনও সামঞ্জস্যের জন্য তৈরি, তবে এটির সাথে লিঙ্ক স্থাপনের দরকার নেই।"
জন জেড। লি

16

উপরের ত্রুটিটি লিংকার ত্রুটি ... লিঙ্কার এমন একটি প্রোগ্রাম যা সংকলক দ্বারা উত্পাদিত এক বা একাধিক অবজেক্ট গ্রহণ করে এবং তাদের একক এক্সিকিউটেবল প্রোগ্রামে সংযুক্ত করে।

আপনাকে অবশ্যই -lboost_systemলিঙ্কার পতাকাগুলি যুক্ত করতে হবে যা লিঙ্কারের দিকে ইঙ্গিত করে যে এটি boost::system::system_category()লাইব্রেরির মতো চিহ্নগুলির সন্ধান করতে হবে libboost_system.so

আপনার যদি মেইন.পি.পি থাকে, হয়:

g++ main.cpp -o main -lboost_system

অথবা

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

5
-l এবং গ্রন্থাগারের নামের মধ্যে স্থানটি ভুল is আপনার -lboost_s systemm ব্যবহার করা উচিত
Portforwardpodcast

1
আমি দেখতে পেয়েছি যে সেন্টোসরা -l এর অবস্থান সম্পর্কে যত্নশীল ছিলেন না তবে উবুন্টু ছিলেন, শেষে থাকতে হবে।
জিজ্ঞাসা_ও

7

CMAKE এবং সন্ধান_প্যাকেজ ব্যবহার করার সময় এটি নিশ্চিত হয়ে নিন:

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

ডি: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_files systemm.cpp :( টেক্সট + 0x54): st বুস্ট :: সিস্টেম :: জেনেরিক_ বিভাগে () এর অপরিবর্তিত রেফারেন্স

সমাধানটি ছিল সিস্টেম-লিবের ডিবাগ সংস্করণটি ব্যবহার করার জন্য:

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
এটি এমন কি হতে পারে যে কোথাও কিছু ডিবাগ পতাকা সংজ্ঞায়িত করা হয়েছিল, সুতরাং আপনার অন্যান্য ডিবাগগুলি ডিবাগে নির্মিত বা জি ++ ডিবাগ অবজেক্ট তৈরি করছিল?
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

এটি জিসিসি 5.3 এর সাথে মিশে ছিল এবং একটি সাধারণ টাইমার উদাহরণ সহ 1.61.0 বৃদ্ধি করেছে।


1
এটি আমার সমস্যাও ছিল। আমি এটি সিএমকে এর মাধ্যমে অন্তর্ভুক্ত করেছি এবং যে কোনও কারণেই, ধরে নেওয়া নির্ভরতা এবং ক্রম ফাইন্ডবুস্ট স্ক্রিপ্টে কাজ করা হয়েছিল। সত্যই, যদিও, আমার সমস্যাটি সর্বদা শেয়ার করা লাইব্রেরিগুলি ব্যবহার করে এবং কখনই মনোযোগ দেয় না, তারপরে স্থির লাইব্রেরিগুলিতে চলে যাওয়া এবং বিল্ড ত্রুটিগুলি পাওয়া যায়। উফ।
অ্যান্টনি

এটি আমার জন্য এটিও ঠিক করে রেখেছে ... এই সমাধানের আগের কাজটি কেবলমাত্র BOOST_ERROR_CODE_HEADER_ONLY এর সংজ্ঞা ছিল worked উবুন্টু 18.04 এ, চটকে 1.68 বাড়িয়ে নিন। আমার ফিক্স: টার্গেট_লিঙ্ক_লাইব্রিজ (এক্সিকিউটেবল প্যাথ্রেড এসএসএল ক্রিপ্টো বুস্ট_সিস্টেম)
লুইস

2

আমার ক্ষেত্রে যোগ -lboost_systemকরা যথেষ্ট ছিল না, এটি এখনও আমার কাস্টম বিল্ড পরিবেশে এটি খুঁজে পেল না। আমাকে "জিসিসি - / 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

আরও তথ্যের জন্য বুস্ট 1.51 দেখুন: "ত্রুটি: বুস্ট_থ্রেডের বিরুদ্ধে লিঙ্ক করতে পারেনি!"


1

... এবং যদি আপনি আপনার প্রধান স্থিতিশীলভাবে লিঙ্ক করতে চেয়েছিলেন তবে আপনার জামফিলে নিম্নলিখিতগুলিকে প্রয়োজনীয়তার সাথে যুক্ত করুন:

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

এবং সম্ভবত:

<linkflags>-static-libgcc
<linkflags>-static-libstdc++
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.