libpthread.so.0: प्रतीकों को जोड़ने में त्रुटि: कमांड लाइन से गायब डीएसओ


205

जब मैं openvswitch-1.5.0 का संकलन कर रहा हूं, तो मुझे निम्नलिखित संकलन त्रुटि का सामना करना पड़ा है:

 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 readelf: Error: '/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परिपत्र निर्भरता के लिए कर सकते हैं ।
Z बोसॉन

2
ध्यान दें कि यह स्रोत फ़ाइलों पर भी लागू होता है - उन्हें पुस्तकालयों से पहले सूचीबद्ध किया जाना चाहिए। आप कमांड लाइन में स्रोत फ़ाइलों की जगह लेने वाली परिणामी ऑब्जेक्ट फ़ाइलों के बारे में सोच सकते हैं, और ऊपर के समान आदेश लागू कर सकते हैं।
जेस्पेंसर

एप्लिकेशन बनाने के लिए मेक-अप का उपयोग करते समय किसी को कहां जोड़ना चाहिए?
कोडजॉम्बी

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
मैंने इस समाधान का उपयोग एक अन्य परियोजना के निर्माण में किया था, जो एलडीएफएलएजीएस-एलटी को जोड़कर एक ही त्रुटि दे रही थी और इसने पूरी तरह से काम किया। धन्यवाद!
मार्क एलुल

त्रुटि अभी भी मेरे लिए बनी हुई है: / usr / bin / ld: gaSim.o: प्रतीक के लिए अपरिभाषित संदर्भ 'pthread_create @@ GLIBC_2.1' /lib/i386-linux-gnu/libpthread.so.0: प्रतीक जोड़ने में त्रुटि: DSO कमांड लाइन से गायब
Aerox

`GlewInit को अपरिभाषित संदर्भ ': भाग में' -lpthread 'जोड़ने हल, लेकिन अब यह मुझे पता चलता है: gaSim.c :( पाठ + 0x11d6)।
Aerox

@ एरॉक्स: के लिए glewInit, आप की जरूरत है-lGLEW
mchiasson

19

पृष्ठभूमि

DSO missing from command lineलिंकर आवश्यक प्रतीक के साथ यह सामान्य खोज है, लेकिन प्रतीक एक सीधे निर्दिष्ट गतिशील पुस्तकालय की निर्भरता में से एक में उपलब्ध है नहीं मिल रहा है संदेश प्रदर्शित किया जाएगा।

पूर्व में लिंकर को उपलब्ध भाषाओं की निर्भरता में प्रतीकों को उपलब्ध माना जाता था। लेकिन बाद के कुछ संस्करण में यह बदल गया और अब लिंकर जो उपलब्ध है उसके बारे में अधिक सख्त दृष्टिकोण को लागू करता है। इस प्रकार संदेश उस संक्रमण के साथ मदद करने के लिए अभिप्रेत है।

क्या करें?

यदि आप सॉफ्टवेयर के अनुरक्षक हैं

आपको यह सुनिश्चित करके इस समस्या को हल करना चाहिए कि आवश्यक प्रतीकों को पूरा करने के लिए आवश्यक सभी पुस्तकालयों को सीधे लिंकर कमांड लाइन पर निर्दिष्ट किया गया है। यह भी ध्यान रखें कि आदेश अक्सर मायने रखता है।

यदि आप केवल सॉफ्टवेयर को संकलित करने का प्रयास कर रहे हैं

एक वैकल्पिक हल के रूप में विकल्प का उपयोग करके प्रतीकों के उपलब्ध होने के अधिक अनुमत दृश्य पर वापस जाना संभव है -Wl,--copy-dt-needed-entries

इसे बनाने या इस्तेमाल करने से पहले LDFLAGS को निर्यात करने के लिए इसे एक बिल्ड में इंजेक्ट करने के सामान्य तरीके हैं configure:

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

कभी-कभी LDFLAGS="-Wl,--copy-dt-needed-entries"सीधे गुजरने से makeभी काम चल सकता है।


gcc संस्करण 7.4.0 (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) ने इस ध्वज को नहीं पहचाना।
यूजरएक्स

1
यह एक gcc विकल्प नहीं है, इसलिए या तो आप -Wl,बिट को याद कर रहे हैं , या आपके पास एक लिंकर है जो इस विकल्प का समर्थन नहीं करता है। आप किस लिंकर का उपयोग कर रहे हैं? यह उत्तर क्लासिक बिनुटिल्स लिंकर (ld.bfd) को मानता है। बिनुटिल्स गोल्ड लिंकर (ld.gold) दस्तावेज़ --copy-dt-needed-entries"समर्थित नहीं" के रूप में। इसलिए यदि आपके पास वह (या कोई अन्य लिंकर जो इस विकल्प का समर्थन नहीं करता है) तो डिफ़ॉल्ट रूप से आपको अनुरक्षकों के लिए अनुभाग का पालन करने या लिंक करने के लिए क्लासिक एलडी पर स्विच करने की आवश्यकता हो सकती है। मुझे लगता है कि आप इसके लिए उपयोग कर सकते हैं -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

समस्या यह है कि कमांड लाइन DID में शामिल नहीं है -lX11 - यद्यपि libX11.so को एक निर्भरता के रूप में जोड़ा जाना चाहिए क्योंकि तर्क में GTK और GNOME पुस्तकालय भी थे।

तो, मेरे लिए एकमात्र स्पष्टीकरण यह है कि इस संदेश का उद्देश्य आपकी मदद करना हो सकता है , लेकिन इसने इसे ठीक से नहीं किया। यह संभवतः सरल था: प्रतीक प्रदान करने वाली लाइब्रेरी को कमांड लाइन में नहीं जोड़ा गया था।

कृपया POSIX में लिंकेज से संबंधित तीन महत्वपूर्ण नियम नोट करें:

  • गतिशील पुस्तकालयों ने निर्भरताएँ परिभाषित की हैं, इसलिए केवल शीर्ष-निर्भरता वाले पुस्तकालयों को जो भी क्रम में आपूर्ति की जानी चाहिए (हालांकि स्थिर पुस्तकालयों के बाद)
  • स्टेटिक लाइब्रेरियों में सिर्फ अपरिभाषित प्रतीक होते हैं - यह आपकी निर्भरता जानने और कमांड लाइन में उन सभी की आपूर्ति करने के लिए आपके ऊपर है
  • स्थैतिक पुस्तकालयों में क्रम हमेशा होता है: पहले , प्रदाता निम्नानुसार है । अन्यथा आप अपरिभाषित प्रतीक संदेश प्राप्त करेंगे, ठीक उसी तरह जब आप लाइब्रेरी को कमांड लाइन में जोड़ना भूल गए थे
  • जब आप लाइब्रेरी को इसके साथ निर्दिष्ट करते हैं -l<name>, तो आप कभी नहीं जानते कि यह लगेगा lib<name>.soया नहीं lib<name>.a। डायनामिक लाइब्रेरी को प्राथमिकता दी जाती है, यदि पाया जाता है, और स्थैतिक पुस्तकालयों को केवल कंपाइलर विकल्प द्वारा लागू किया जा सकता है - बस। और क्या आपको ऊपर की तरह कोई समस्या है, यह इस बात पर निर्भर करता है कि आपके पास स्थैतिक या गतिशील पुस्तकालय थे या नहीं
  • खैर, कभी-कभी गतिशील पुस्तकालयों में निर्भरता की कमी हो सकती है: डी

यह न केवल आपकी मदद करने के लिए अभिप्रेत है, यह प्रश्न में नामों को हल करने के लिए लिंकर द्वारा आवश्यक है। त्रुटि पूरी तरह से वैध है। यदि संकलक ने यह तय करने का निर्णय लिया है कि, आपको बस उस चीज तक पहुंचने के लिए एक segfault मिलेगा जो बाइनरी रनटाइम में नहीं है।
केव्री 25'18

1
जोड़ने के लिए, यह संभव है कि विभिन्न प्लेटफार्मों पर, स्रोत अलग-अलग संकलित हो; एक सिस्टम पर जो जुड़ा हुआ है वह दूसरे पर लिंक नहीं हो सकता है। यह आमतौर पर मामला नहीं है, लेकिन यह 100% प्रशंसनीय है।
केव्री

समस्या यह नहीं है कि यह मान्य नहीं है, लेकिन यह समस्या का कारण खोजने के लिए बिल्कुल मददगार नहीं है।
इथोरिस

7

मैंने पाया कि मेरे पास भी यही त्रुटि थी। मैं लैपैक और ब्लास दोनों के साथ एक कोड संकलित कर रहा था। जब मैंने यह आदेश दिया कि दो पुस्तकालयों को बुलाया गया तो त्रुटि दूर हो गई।

"LAPACK_LIB = -llapack -lblas" ने काम किया जहां "LAPACK_LIB = -lblas -llapack" ने ऊपर वर्णित त्रुटि दी।


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 ++ कमांड से लिंक करना। (यह पहले से ही मेकफाइल में LIBS सूची में एक बार दिखाई दिया।) मैंने मेकफाइल में LDFLAGS परिभाषा में "-L / lib / x86_64-linux-gnu" भी जोड़ा है।
यूजरएक्स

2

मैंने पाया है कि कभी-कभी पुस्तकालय जो लिंकर के बारे में शिकायत करता है वह समस्या पैदा करने वाला नहीं है। संभवतः वहाँ एक चतुर तरीका है जहाँ समस्या है, लेकिन समस्या यह है कि मैं क्या करूँ:

  • लिंक कमांड में सभी लिंक्ड लाइब्रेरियों पर टिप्पणी करें।
  • सभी .o's .so इत्यादि को साफ करें (आमतौर पर साफ करना पर्याप्त है, लेकिन आप एक पुनरावर्ती खोज + rm, या कुछ इसी तरह चलाना चाहते हैं) हो सकता है।
  • लिंक कमांड एक में पुस्तकालयों को एक समय में रद्द करें और आवश्यकतानुसार आदेश को फिर से व्यवस्थित करें।

@ कृति कारसेव: मैं एक ही समस्या के साथ आया हूँ CentOS7 पर एक gcc 4.8.2 cmake परियोजना। "लक्ष्य_लिंक_ पुस्तकालय" अनुभाग में पुस्तकालयों का क्रम महत्वपूर्ण है। मुझे लगता है कि cmake सिर्फ लिंकर पर सूची को पास करता है, जैसा है, यानी यह सही क्रम को आज़माकर काम नहीं करता है। यह उचित है - जब आप इसके बारे में सोचते हैं कि cmake नहीं जान सकता कि लिंकिंग सफलतापूर्वक पूरा होने तक सही क्रम क्या है।



1

वही समस्या मुझे तब हुई जब मैं distccअपने सी ++ प्रोजेक्ट को बनाने के लिए उपयोग करता हूं; अंत में मैंने इसे हल कर लिया export CXX="distcc g++"


1

यदि आप cmake और pthreads का उपयोग कर रहे हैं, तो निम्न पंक्तियों को जोड़ने का प्रयास करें

find_package(Threads)
target_link_libraries(${CMAKE_THREAD_LIBS_INIT})

0

मेरे साथ भी ऐसा ही हुआ क्योंकि मैं HPCC बेंचमार्क (HPL और कुछ अन्य बेंचमार्क शामिल कर रहा था) स्थापित कर रहा था। मैंने -lmअपनी बिल्ड स्क्रिप्ट में कंपाइलर के झंडे जोड़े और फिर इसे सफलतापूर्वक संकलित किया।


3
यह न तो इस विशिष्ट प्रश्न का उत्तर देता है और न ही समान समस्याओं के परिवार के लिए एक सामान्य उत्तर देता है। यह पूरी तरह से एक और सवाल के लिए एक अत्यधिक स्थानीयकृत उत्तर है ।
हरमन डोपेस


0

Makefile-pthread में लाइब्रेरी सूची के अंत में जोड़ने का प्रयास करें

इसने मेरे लिए काम किया।


0

यदि आप CMake का उपयोग कर रहे हैं, तो कुछ तरीके हैं जो आप इसे हल कर सकते हैं:

समाधान 1: सबसे सुरुचिपूर्ण एक

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

समाधान 2: CMake का उपयोग करना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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.