2013-02-15 10 views
11

है, मैंने हाल ही में एक यूबंटू मशीन पर hdf5 लाइब्रेरी स्थापित की है, और अब निर्यात किए गए कार्यों से जुड़ने में समस्या आ रही है। मैं readHDF.cpp एक साधारण परीक्षण स्क्रिप्ट लिखा मुद्दा समझाने के लिए:g ++ संकलन त्रुटि: साझा साझा लाइब्रेरी फ़ंक्शन के लिए अनिर्धारित संदर्भ जो

#include <hdf5.h> 

int main(int argc, char * argv[]) 
{ 
    hid_t  h5_file_id = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT); 
    return 0; 
} 

संकलन आदेश

g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include \ 
    -L$HOME/hdf5/lib -l:$HOME/hdf5/lib/libhdf5.so readHDF.cpp 

जो निम्नलिखित त्रुटि देता है

/tmp/cc6DXdxV.o: In function `main': 
readHDF.cpp:(.text+0x1f): undefined reference to `H5check_version' 
readHDF.cpp:(.text+0x3c): undefined reference to `H5Fopen' 
collect2: ld returned 1 exit status 

मैं उलझन में हूँ क्योंकि एनएम कमांड कहता है कि फ़ंक्शन निर्यात किया गया है:

nm -C $HOME/hdf5/lib/libhdf5.so | grep H5check_version 

जो रिटर्न

0000000000034349 T H5check_version 

और H5Fopen के लिए एक समान परिणाम। क्या गलत हो सकता है पर कोई विचार? सुनिश्चित नहीं हैं कि यह मदद करता है, लेकिन अगर मैं बाहर टिप्पणी स्क्रिप्ट के H5Fopen भाग है, तो यह ठीक संकलित करता है, तो:

#include <hdf5.h> 

int main(int argc, char * argv[]) 
{ 
hid_t  h5_file_id;// = H5Fopen(argv[1], H5F_ACC_RDWR, H5P_DEFAULT); 
return 0; 
} 

इसके अलावा जो इस तरह के रूप में विभिन्न अजगर मॉड्यूल द्वारा किया जाता है सर्वर पर स्थापित HDF5 के कई संस्करण हैं h5py और तालिकाओं, लेकिन मैं उनमें से कोई भी काम करने के लिए नहीं मिला, इसलिए मैंने इस संस्करण को अपनी स्थानीय निर्देशिका में स्थापित किया और g ++ लिंकर के लिए rpath विकल्प बदल दिए।

उत्तर

26

ठीक है, हल: इसके अलावा, वहाँ यह काम करना चाहिए के लिए -l:$HOME/hdf5/lib/libhdf5.so

आवश्यकता नहीं है। यह संकलन संकलन कमांड में -lhdf5 के प्लेसमेंट में था। स्पष्ट रूप से -lhdf5 को पढ़ने के बाद रखा जाना चाहिएHDF.cpp। उदाहरण के लिए g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include readHDF.cpp -lhdf5 कोई समस्या नहीं संकलित करेगा, लेकिन g++ -Wl,-rpath=$HOME/hdf5/lib -L$HOME/hdf5/lib -I$HOME/hdf5/include -lhdf5 readHDF.cpp अपरिभाषित संदर्भ त्रुटियों के साथ विफल हो जाएगा। दिलचस्प बात यह है कि उबंटू 12.04 के लिए यह केवल एक समस्या थी, क्योंकि संकलन आदेश दोनों उबंटू 10.04 के लिए काम करते थे।

इस पोस्ट पर मिले विवरण के साथ जवाब:

undefined reference to symbol even when nm indicates that this symbol is present

मैं -lXXX रखने लगता है के बाद स्क्रिप्ट सुरक्षित अभ्यास है।

+0

अजीब। लिपि से पहले '-lhdf5' डालकर, और सब कुछ ठीक काम करता है। जब मैं इसे स्क्रिप्ट के बाद रखता हूं, तो यह पुस्तकालय त्रुटियों को देता है। – Mathias711

+1

मैं इसे पर्याप्त रूप से ऊपर नहीं उठा सकता। धन्यवाद! – stormbreaker

+0

+500 अगर मैं – johnjg12

0

आप संकलन आदेश में -lhdf5 डालना भूल गए। $ g++ -Wl,-rpath,$HOME/hdf5/lib -I$HOME/hdf5/include -L$HOME/hdf5/lib -lhdf5 readHDF5.cpp

+0

"जीसीसी reuqire आप यह है कि वे एक दूसरे पर निर्भर में वस्तु फ़ाइलों और पुस्तकालयों डाल ... के हाल के संस्करण" देखो मुझे लगता है कि मूल रूप से करने की कोशिश की और यह एक ही त्रुटि दे दी है। Libhdf5.so * $ HOME/hdf5/lib में उदाहरण के लिए libhdf5.so.6 और libhdf5.so.6.0.3 आदि के कई संस्करण हैं, इसलिए मैं अधिक विशिष्ट होने में मदद करता हूं, लेकिन ऐसा नहीं हुआ। – dermen

+0

और -lhdf5 के बारे में क्या? मैं आपकी मशीन पर आपके प्रश्न में सटीक लिंकर त्रुटि को पुन: पेश कर सकता हूं, और -lhdf5 समस्या को हल करता है। –

+0

हाँ, -lhdf5 जोड़ने से मदद नहीं मिली। यह एक बहुत अजीब बग है। मैंने उबंटू 10 मशीन पर बिल्कुल उसी तरह स्थापित किया और यह ठीक काम किया। – dermen

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