2017-04-06 6 views
32

में मौजूद है मैं इसी तरह के सवाल (जैसे this, that या this) के एक नंबर मिल गया है, लेकिन उनमें से कोई मुझे मेरी समस्या का समाधान में मदद की।जी ++ अपरिभाषित संदर्भ हालांकि प्रतीक * .so फ़ाइल

$nm libgnss_system_parameters_dyn.so | c++filt |grep Gps_Eph 

प्रतीक Gps_Ephemeris::Gps_Ephemeris() है, जो एक निर्माता माना जाता है शामिल हैं: मुझे लगता है कि, के रूप में द्वारा संकेत एक * .so फ़ाइल (gnss-sdr की कोर से) है।

#include <iostream> 
#include <core/system_parameters/gps_ephemeris.h> 

int main(int argc,const char* argv[]) 
{ 
    Gps_Ephemeris ge; 
    return 0; 
} 

जो मैं के साथ संकलन:

g++ main.cpp -std=c++0x -I some_include_path -L some_lib_path -l gnss_system_parameters_dyn` 

लिंकर तो शिकायत:

मैं कुछ न्यूनतम कोड लिखा है

/tmp/ccHCvldG.o: In function `main': 
main.cpp:(.text+0x33): undefined reference to `Gps_Ephemeris::Gps_Ephemeris()' 
collect2: error: ld returned 1 exit status 

मैं भी cmake की कोशिश की, लेकिन यह उत्पन्न लाइन उस के समान थी (यह अभीजोड़ा गया था लिंक करने से पहले), और यह अभी भी सटीक वही लिंकर त्रुटि उत्पन्न करता है।

ध्यान दें कि लाइब्रेरी और मेरे न्यूनतम कोड दोनों एक ही कंपाइलर (जी ++ - 5) के साथ संकलित किए जा रहे हैं, ठीक उसी झंडे और एक ही सी ++ 0x मानक के साथ।

nm --demangle --defined-only --extern-only libgnss_system_parameters.so |grep Gps_Eph 

नहीं है उत्पादन कुछ भी:


मैक्सिम Egorushkin, लाइन द्वारा जवाब को संबोधित करते। हालांकि, प्रतीक स्थिर पुस्तकालय (यानी * ए पुस्तकालय) में परिभाषित किया गया है:

00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris() 
00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris() 

यह जानते हुए कि दोनों निम्नलिखित तरीके से, cmake द्वारा उत्पन्न कर रहे:

add_library(lib_name SHARED ${sources_etc}) #for the *.so 
add_library(lib_name_2 ${sources_etc}) #for the *.a 

उन पुस्तकालयों में निहित/परिभाषित प्रतीकों में कोई अंतर नहीं होना चाहिए, है ना? मैंने सेमीके के दस्तावेज़ों में add_library पर कुछ भी ध्यान नहीं दिया। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

+3

आपने कहा कि आउटपुट _ प्रतीक 'Gps_Ephemeris :: Gps_Ephermeris() '_ है, लेकिन वास्तविक आउटपुट नहीं दिखाता है। यह प्रासंगिक है, और उपयोगी होगा। साथ ही, आपने स्पष्ट रूप से प्रश्न में उस प्रतीक को कॉपी और चिपकाया नहीं है, क्योंकि आपने इसे गलत तरीके से याद किया है। मैं इस तरह के लिखित सारांशों से अविश्वासू हूं, क्योंकि यदि आप अपने सारांश से बाहर निकलने के लिए एक विश्वसनीय न्यायाधीश थे, तो शायद आप सवाल नहीं पूछेंगे। – Useless

+0

उस पर ध्यान देने के लिए धन्यवाद, मैंने इसे ठीक किया। मैं ज्यादातर उच्च स्तरीय कंप्यूटर दृष्टि करता हूं, इसलिए हां, मुझे यह तय करने के लिए अयोग्य महसूस होता है कि क्या बाहर रखा जाना है। जितनी जल्दी हो सके मैं आउटपुट पोस्ट करूंगा। – Ash

+0

स्रोत कोड को देखे बिना यह कहना मुश्किल है कि एक ही स्रोत से बनाया गया .so और .a विभिन्न प्रतीकों का निर्यात क्यों करता है। सशर्त संकलन शामिल हो सकता है। –

उत्तर

17

यह जांचने के लिए पैडेंटिकली सही तरीका है कि .so एक प्रतीक निर्यात करता है nm --demangle --dynamic --defined-only --extern-only <lib.so> | grep <symbol> है।

--defined-only के बिना आपके कमांड को प्रतीकों को भी परिभाषित करता है।

--extern-only के बिना यह आंतरिक लिंक के साथ प्रतीकों को भी दिखाता है जो लिंक करने के लिए अनुपलब्ध हैं।

ऐसा लगता है कि आपको दूसरी लाइब्रेरी को लिंक करने की आवश्यकता है क्योंकि Gps_Ephemeris::Gps_Ephermeris()libgnss_system_parameters_dyn.so को लिंक करके हल नहीं किया गया है। शुरू करने का एक अच्छा तरीका पुस्तकालय के दस्तावेज और उदाहरण है।

+0

बहुत बहुत धन्यवाद! तुम सही थे। हालांकि, प्रतीकों (समकक्ष) स्थिर पुस्तकालय में मौजूद हैं। मैंने अंत में कुछ जानकारी के साथ प्रश्न अद्यतन किया। क्या आप कृपया एक नज़र डालें? – Ash

1

मुझे अतीत में पता चला है कि इस प्रकार की त्रुटि उचित फ़ाइल में extern "C" { ... } ब्रैकेटिंग की कमी के कारण होती है।

+1

क्या आप विस्तारित कर सकते हैं कि कैसे 'बाहरी "सी" 'लिंकेज कन्स्ट्रक्टर हैंडल करता है? –

+0

यह नहीं करता है। वे सी का हिस्सा नहीं हैं, लेकिन सी ++ के हैं। – Nicole

संबंधित मुद्दे