libpthread.so.0: চিহ্ন যোগ করার সময় ত্রুটি: কমান্ড লাইন থেকে ডিএসও অনুপস্থিত


205

আমি যখন ওপেনসুইচ -১.০.০ সংকলন করছি তখন আমি নিম্নলিখিত সংকলনের ত্রুটির মুখোমুখি হয়েছি:

 gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
     -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init  -g -O2 -export-dynamic ***-lpthread***  -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
 /home/jyyoo/src/dpdk/build/lib/librte_eal.a
 /home/jyyoo/src/dpdk/build/lib/libethdev.a
 /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
 /home/jyyoo/src/dpdk/build/lib/librte_hash.a
 /home/jyyoo/src/dpdk/build/lib/librte_lpm.a
 /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
 /home/jyyoo/src/dpdk/build/lib/librte_ring.a
 /home/jyyoo/src/dpdk/build/lib/librte_mempool.a
 /home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm 
     /usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
     to symbol 'pthread_create@@GLIBC_2.2.5'
     /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from 
     command line

আমি যদি এর প্রতীকগুলি দেখার চেষ্টা করি তবে libpthreadএটি দেখতে ভালই লাগছে।

$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
   199: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2

আপনি কোনও ইঙ্গিত বা পয়েন্টার দিতে পারেন?




# readelf -s /lib/x86_64-linux-gnu/libncurses.so পঠিত: ত্রুটি: '/lib/x86_64-linux-gnu/libncurses.so' সনাক্ত করতে পারেনি। সিস্টেম ত্রুটির বার্তা: প্রতীকী লিঙ্কগুলির অনেকগুলি স্তর
আশীষ কার্পে


4
Goddamnit, আমি gccনাg++
পোস্ট স্বয়ং

উত্তর:


162

অবজেক্ট ফাইলগুলি সংকলনের পরে আপনার কমান্ড লাইনে পাঠাগারটি উল্লেখ করা উচিত :

 gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init \
     -g -O2 -export-dynamic -o utilities/ovs-dpctl utilities/ovs-dpctl.o \
     lib/libopenvswitch.a \
     /home/jyyoo/src/dpdk/build/lib/librte_eal.a /home/jyyoo/src/dpdk/build/lib/libethdev.a /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a /home/jyyoo/src/dpdk/build/lib/librte_hash.a /home/jyyoo/src/dpdk/build/lib/librte_lpm.a /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a /home/jyyoo/src/dpdk/build/lib/librte_ring.a /home/jyyoo/src/dpdk/build/lib/librte_mempool.a /home/jyyoo/src/dpdk/build/lib/librte_malloc.a \
     -lrt -lm -lpthread 

ব্যাখ্যা: লিঙ্কিং মডিউলগুলির ক্রমের উপর নির্ভরশীল। প্রতীকগুলি প্রথমে অনুরোধ করা হয় এবং তারপরে একটি লাইব্রেরি থেকে লিঙ্কযুক্ত হয়। সুতরাং আপনাকে মডিউলগুলি উল্লেখ করতে হবে যা প্রথমে লাইব্রেরি ব্যবহার করে এবং তার পরে গ্রন্থাগারগুলি। এটার মত:

gcc x.o y.o z.o -la -lb -lc

তদুপরি, একটি বিজ্ঞপ্তি নির্ভরতা আছে যদি, আপনি কমান্ড লাইনে একই লাইব্রেরি বেশ কয়েকবার নির্দিষ্ট করা উচিত। সুতরাং যদি এর libbথেকে প্রতীক প্রয়োজন হয় libcএবং এর থেকে প্রতীক libcপ্রয়োজন হয় libb, কমান্ড লাইনটি হওয়া উচিত:

gcc x.o y.o z.o -la -lb -lc -lb

23
আমি মনে করি আপনি -Wl,--start-group -la -lb- -lc -Wl,--end-groupবিজ্ঞপ্তি নির্ভরতা জন্য করতে পারেন ।
জেড বোসন

2
নোট এটি উত্স ফাইলগুলিতেও প্রযোজ্য - সেগুলি লাইব্রেরির আগে তালিকাভুক্ত করা উচিত। আপনি কমান্ড লাইনে উত্স ফাইলগুলির স্থান নেওয়ার ফলে প্রাপ্ত অবজেক্ট ফাইলগুলির কথা ভাবতে পারেন এবং উপরের মত একই ক্রম প্রয়োগ করতে পারেন।
jspencer

অ্যাপ্লিকেশনটি তৈরি করতে মেক ব্যবহার করার সময় কোনও কোথায়-যোগ করা উচিত?
কোডজম্বি

50

ত্রুটি বার্তা বিতরণ / সংকলক সংস্করণ উপর নির্ভর করে:

উবুন্টু সসেসি:

/usr/bin/ld: /mnt/root/ffmpeg-2.1.1//libavformat/libavformat.a(http.o): undefined reference to symbol 'inflateInit2_'
/lib/x86_64-linux-gnu/libz.so.1: error adding symbols: DSO missing from command line

উবুন্টু লালন: (আরও তথ্যপূর্ণ)

/usr/bin/ld: note: 'uncompress' is defined in DSO /lib/x86_64-linux-gnu/libz.so.1 so try adding it to the linker command line

সমাধান: লিঙ্কিংয়ের পর্যায়ে আপনি আপনার সংকলনের পদক্ষেপগুলিতে একটি গ্রন্থাগার মিস করতে পারেন। আমার ক্ষেত্রে, আমি মেকফিল / জিসিসি পতাকাগুলিতে '-lz' যুক্ত করেছি।

পটভূমি: ডিএসও হ'ল একটি গতিশীল শেয়ার্ড অবজেক্ট বা একটি ভাগ করা লাইব্রেরি।


1
আমি এই সমাধানটি অন্য একটি প্রকল্প তৈরিতে ব্যবহার করেছি যা এলডিএফএলএগ্রস -lz যুক্ত করে একই ত্রুটি প্রদান করেছিল এবং এটি পুরোপুরি কার্যকর হয়েছিল। ধন্যবাদ!
মার্ক এলিউল

ত্রুটিটি এখনও আমার কাছে রয়ে গেছে: / usr / bin / ld: gaSim.o: 'pthread_create @@ GLIBC_2.1' /lib/i386-linux-gnu/libpthread.so.0: প্রতীক যোগ করার সময় ত্রুটিটি সম্পর্কিত: ডিএসও কমান্ড লাইন থেকে অনুপস্থিত
অ্যারোক্স

অংশবিশেষে '-pthread' যোগ করার সমাধান হয়েছে, তবে এখন এটি আমাকে দেখায়: gaSim.c :(। পাঠ্য + 0x11d6): :5 glewInit 'এর অপরিবর্তিত রেফারেন্স
এয়ারক্স

@ অ্যারোক্স: এর জন্য glewInitআপনার প্রয়োজন-lGLEW
এমচিএসন

19

পটভূমি

DSO missing from command lineলিঙ্কারটি যখন তার সাধারণ অনুসন্ধানের সাথে প্রয়োজনীয় প্রতীকটি খুঁজে না পায় তবে বার্তাটি প্রদর্শিত হবে তবে প্রতীকটি সরাসরি নির্দিষ্ট গতিশীল লাইব্রেরির নির্ভরতার একটিতে পাওয়া যায়।

অতীতে লিঙ্কার নির্দিষ্ট ভাষাগুলির নির্ভরতার মধ্যে প্রতীকগুলি উপলভ্য বলে বিবেচনা করত। তবে এটি পরবর্তী কোনও সংস্করণে পরিবর্তিত হয়েছিল এবং এখন লিঙ্কার যা উপলব্ধ তা আরও কঠোর দৃষ্টিভঙ্গি প্রয়োগ করে। বার্তাটি এই রূপান্তরটিতে সহায়তা করার উদ্দেশ্যে তৈরি।

কি করো?

আপনি যদি সফ্টওয়্যারটির রক্ষণাবেক্ষণকারী হন

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

আপনি যদি কেবল সফ্টওয়্যারটি সংকলন করার চেষ্টা করছেন

কার্যকারণ হিসাবে বিকল্পটি ব্যবহার করে কী কী প্রতীকগুলি পাওয়া যায় তার আরও অনুমোদনযোগ্য দৃষ্টিভঙ্গিতে ফিরে যাওয়া সম্ভব -Wl,--copy-dt-needed-entries

এটিকে কোনও বিল্ডে ইনজেক্ট করার সাধারণ উপায়গুলি হল চালানোর আগে configureবা এর মতো মিলে এলডিএফএলএজিএস রফতানি করা :

export LDFLAGS="-Wl,--copy-dt-needed-entries"

কখনও কখনও LDFLAGS="-Wl,--copy-dt-needed-entries"সরাসরি makeযেতে কাজ করতে পারে।


gcc সংস্করণ 7.4.0 (উবুন্টু 7.4.0-1ubuntu1 ~ 18.04.1) এই পতাকাটি চিনতে পারে নি।
ইউজারএক্স

1
এটি কোনও গিসি বিকল্প নয়, সুতরাং হয় আপনি -Wl,বিটটি মিস করছেন বা আপনার সাথে একটি লিঙ্কার রয়েছে যা এই বিকল্পগুলি সমর্থন করে না। আপনি কোন লিঙ্কার ব্যবহার করছেন? এই উত্তরটি ক্লাসিক বাইনুটিলস লিঙ্কার (ld.bfd) ধরে নেয়। --copy-dt-needed-entries"সমর্থিত নয়" হিসাবে বিন্টুলস সোনার লিংকার (ld.gold) নথি । সুতরাং যদি আপনার কাছে (বা অন্য কোনও লিঙ্কার যা এই বিকল্পটিকে সমর্থন করে না) আপনার ডিফল্ট হিসাবে রক্ষণাবেক্ষণকারীদের জন্য বিভাগটি অনুসরণ করতে হবে বা লিঙ্ক করার জন্য ক্লাসিক এলডিতে স্যুইচ করতে হবে। আমি মনে করি আপনি এটির -fuse-ld=ld.bfdজন্য ব্যবহার করতে পারেন ।
টেক্সটহেল

14

আমি অন্য একটি কেস পেয়েছি এবং তাই আমি আপনাকে সমস্ত ভুল বলে মনে করি।

এটি আমার ছিল:

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: eggtrayicon.o: undefined reference to symbol 'XFlush'
/usr/lib64/libX11.so.6: error adding symbols: DSO missing from command line

সমস্যাটি হ'ল কমান্ড লাইনটি ডিআইডি নেই -lX11- যদিও libX11.so নির্ভরতা হিসাবে যুক্ত করা উচিত কারণ আর্গুমেন্টগুলিতে জিটিকে এবং জিনোম লাইব্রেরিও ছিল।

সুতরাং, আমার একমাত্র ব্যাখ্যা হ'ল এই বার্তাটি আপনাকে সহায়তা করার উদ্দেশ্যে তৈরি করা হয়েছিল তবে এটি এটি সঠিকভাবে করেনি। এটি সম্ভবত সহজ ছিল: পাঠাগারটি প্রতীক সরবরাহ করে কমান্ড লাইনে যোগ করা হয়নি not

পসিক্সে লিঙ্কেজ সম্পর্কিত তিনটি গুরুত্বপূর্ণ নিয়ম নোট করুন:

  • ডায়নামিক লাইব্রেরিতে নির্ভরতা সংজ্ঞায়িত করা হয়েছে, সুতরাং শীর্ষ-নির্ভরতা থেকে কেবল গ্রন্থাগারগুলি যে কোনও ক্রমে সরবরাহ করা উচিত (যদিও স্থির লাইব্রেরির পরে)
  • স্ট্যাটিক লাইব্রেরিতে সবেমাত্র অপরিবর্তিত চিহ্ন রয়েছে - তাদের নির্ভরতাগুলি জানতে এবং কমান্ড লাইনে সেগুলি সরবরাহ করার বিষয়টি আপনার হাতে
  • এ আদেশ স্ট্যাটিক লাইব্রেরি সবসময় হল: অনুরোধকারীকে প্রথম , প্রদানকারী অনুসরণ । অন্যথায় আপনি অপরিবর্তিত প্রতীক বার্তা পাবেন ঠিক যেমন আপনি কমান্ড লাইনে লাইব্রেরি যুক্ত করতে ভুলে গিয়েছিলেন
  • যখন আপনার সাথে লাইব্রেরি নির্দেশিত -l<name>, আপনি কি জানেন না তা গ্রহণ করা হবে lib<name>.soবা lib<name>.a। ডায়নামিক লাইব্রেরিটি অগ্রাধিকার দেওয়া হয়, যদি পাওয়া যায় এবং স্থির লাইব্রেরিগুলি কেবল সংকলক বিকল্প দ্বারা প্রয়োগ করা যেতে পারে - এগুলিই। এবং উপরের মতো আপনার কোনও সমস্যা আছে কিনা তা নির্ভর করে আপনার স্ট্যাটিক বা গতিশীল লাইব্রেরি ছিল কিনা তার উপর depends
  • ভাল, কখনও কখনও নির্ভরশীলতা গতিশীল লাইব্রেরিতে অভাব হতে পারে: ডি

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

1
যোগ করার জন্য, বিভিন্ন প্ল্যাটফর্মগুলিতে, উত্সটি পৃথকভাবে সংকলিত করা সম্ভব হয়; যা একটি সিস্টেমে লিঙ্কযুক্ত তা অন্যটিতে লিঙ্কযুক্ত নাও হতে পারে। এটি সাধারণত এটি হয় না, তবে এটি 100% প্রশ্রয়যোগ্য।
কেভর

সমস্যাটি এমন নয় যে এটি বৈধ নয়, তবে সমস্যার কারণটি খুঁজে পেতে এটি ঠিক সহায়ক নয়।
ইথুরিস

7

আমি আমার একই ত্রুটি ছিল খুঁজে পেয়েছি। আমি ল্যাপ এবং ব্লেস উভয় সহ একটি কোড তৈরি করছিলাম। যখন আমি আদেশটি স্যুইচ করেছি যে দুটি গ্রন্থাগারকে ত্রুটি বলা হয়েছিল তখনই চলে গেল।

"LAPACK_LIB = -lalapack -lblas" যেখানে উপরোক্ত বর্ণিত ত্রুটি দিয়েছে "LAPACK_LIB = -lblas -lalapack" সেখানে কাজ করেছে।


9
চামেক সংজ্ঞায়িত প্রকল্পে আমি এই ত্রুটিটি পেয়েছি ... সুতরাং চামকে কি এমন কোনও বাগ আছে যা লিঙ্কারের ক্রমটিকে ভুল করে দেয়?
পিটার করাসেভ

@peterkarasev উত্তর দেওয়ার: ব্যবহার করার চেষ্টা করুন find_package(Threads)এবংtarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
activedecay

7

আমিও একই সমস্যার মুখোমুখি হয়েছি। আমি জানি না কেন, আমি কেবল -lpthreadসংকলক এবং সবকিছু ঠিক করার বিকল্প যুক্ত করি ।

পুরানো:

$ g++ -rdynamic -m64 -fPIE -pie  -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt

নিম্নলিখিত ত্রুটি পেয়েছে। যদি আমি -lpthreadউপরের কমান্ডের বিকল্প যুক্ত করি তবে ঠিক আছে।

/usr/bin/ld: /tmp/node/out/Release/obj.host/v8_libbase/deps/v8/src/base/platform/condition-variable.o: undefined reference to symbol 'pthread_condattr_setclock@@GLIBC_2.3.3'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

এটি আমার পক্ষে কাজ করেছিল; লিঙ্কটি করে এমন মেকফাইলে আমাকে g ++ কমান্ডে একটি দ্বিতীয়, "রিডানডান্ট" -প্ল্যাড যুক্ত করতে হয়েছিল। (এটি ইতিমধ্যে মেকফাইলে এলআইবিএস তালিকায় একবার উপস্থিত হয়েছিল)) আমি মেকফাইলে এলডিএফএলএলএসএস সংজ্ঞায় "-L / lib / x86_64-linux-gnu" যুক্তও করেছি।
ইউজারএক্স

2

আমি যা খুঁজে পেয়েছি তা হল যে লিঙ্কারটি যে লাইব্রেরি সম্পর্কে অভিযোগ করে সেগুলি কখনও কখনও সমস্যা তৈরি করে না। সমস্যা যেখানে আছে সম্ভবত কাজ করার জন্য একটি চতুর উপায় আছে তবে এটি আমিই করি:

  • লিঙ্ক কমান্ডে লিঙ্কযুক্ত সমস্ত লাইব্রেরি মন্তব্য করুন।
  • সমস্ত।
  • লিঙ্ক কমান্ডে লাইব্রেরিগুলিকে একবারে কমেন্ট করুন এবং প্রয়োজনমতো পুনরায় ব্যবস্থা করুন।

@ পেটার কারাসেভ: আমি CentOS7-তে একটি সিসি 4.8.2 ক্যামেক প্রকল্প নিয়ে একই সমস্যাটি দেখতে পেয়েছি। "টার্গেট_লিঙ্ক_লাইব্রিজি" বিভাগে পাঠাগারগুলির ক্রম গুরুত্বপূর্ণ। আমি অনুমান করি যে চটকে ঠিক লিঙ্কারে লিস্টারে লিখিত আছে যেমন, এটি চেষ্টা করে না এবং সঠিক ক্রমটি কার্যকর করে না। এটি যুক্তিসঙ্গত - যখন আপনি এটি সম্পর্কে চিন্তা করেন তখন লিংকটি সফলভাবে সম্পন্ন না হওয়া অবধি সঠিক অর্ডারটি কী তা জানতে পারবেন না ক্যামকে।



1

আমি যখন distccআমার সি ++ প্রকল্প তৈরি করতে ব্যবহার করি তখন একই সমস্যাটি ঘটেছিল ; শেষ পর্যন্ত আমি এটি দিয়ে সমাধান করেছি export CXX="distcc g++"


1

আপনি যদি cmake এবং ব্যবহৃত pthreads ব্যবহার করছেন, নিম্নলিখিত লাইন যোগ করার চেষ্টা করুন

find_package(Threads)
target_link_libraries(${CMAKE_THREAD_LIBS_INIT})

0

আমি এইচপিসিসির বেঞ্চমার্ক ইনস্টল করার সময় আমার সাথে একই ঘটনা ঘটেছে (এইচপিএল এবং কয়েকটি অন্যান্য মানদণ্ড অন্তর্ভুক্ত)। আমি -lmআমার বিল্ড স্ক্রিপ্টে সংকলক পতাকাগুলিতে যুক্ত করেছি এবং তারপরে এটি সফলভাবে সংকলিত।


3
এটি এই নির্দিষ্ট প্রশ্নের উত্তর দেয় না বা অনুরূপ সমস্যার পরিবারের জন্য কোনও সাধারণ উত্তর দেয় না। এটি সম্পূর্ণরূপে অন্য প্রশ্নের জন্য একটি উচ্চ স্থানীয় উত্তর ।
হারমান ডাপ্পেস

0

যদি ব্যবহার করে থাকেন তবে g++নিশ্চিত হয়ে নিন যে আপনি gccপরিবর্তে চলছেন না


3
কেন? আপনি কিছুটা ব্যাখ্যা করতে পারেন?
ইভান Ivković

0

মেকফাইলে-pthread লাইব্রেরির তালিকার শেষে যুক্ত করার চেষ্টা করুন ।

এটা আমার জন্য কাজ করেছে।


0

আপনি যদি সিএমকে ব্যবহার করছেন তবে কিছু উপায় রয়েছে যা আপনি এটি সমাধান করতে পারেন:

সমাধান 1: সবচেয়ে মার্জিত একটি

add_executable(...)
target_include_directories(...)
target_link_libraries(target_name pthread)

সমাধান 2: সিএমকে ব্যবহার করেfind_package

find_package(Threads REQUIRED) # this will generate the flag for CMAKE_THREAD_LIBS_INIT

add_executable(...)
target_include_directories(...)
target_link_libraries(target_name ${CMAKE_THREAD_LIBS_INIT})

সমাধান 3: সিএমকে পতাকা পরিবর্তন করুন

# e.g. with C++ 17, change to other version if you need
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.