2009-07-22 12 views
14

मैं एक पुस्तकालय libgdata कुछ परीक्षण और गैर इंस्टॉल किए गए प्रोग्राम है कि बना रहा हूं। मैं इस समस्या में चला रहा हूँ कि एक बार मैं पुस्तकालय एक बार स्थापित किया है, कार्यक्रम अब किसी भी स्थापित संस्करण को जोड़ने जा करने के लिए और नहीं ../src/libgdata.la में स्थानीय संस्करण लगते हैं।स्थानीय विकास पुस्तकालय की बजाय स्थापित लाइब्रेरी के खिलाफ ऑटोकॉन्फ़/ऑटोमेक प्रोजेक्ट लिंक क्यों करेगा?

यह क्या कारण हो सकता है? क्या मैं कुछ गलत कर रहा हूँ?

INCLUDES = -I$(top_srcdir)/src/ -I$(top_srcdir)/test/ 

# libapiutil contains all of our dependencies! 
AM_CXXFLAGS = $(APIUTIL_CFLAGS) 
AM_LDFLAGS = $(APIUTIL_LIBS) 

LDADD = $(top_builddir)/src/libgdata.la 

noinst_PROGRAMS = gdatacalendar gdatayoutube 

gdatacalendar_SOURCES = gdatacalendar.cc 

gdatayoutube_SOURCES = gdatayoutube.cc 

TESTS = check_bare 

check_PROGRAMS = $(TESTS) 

check_bare_SOURCES = check_bare.cc 

,

तो उदाहरण के लिए (libapiutil एक और पुस्तकालय libcurl और libxml ++ से निपटने के लिए कुछ सहायक सामान है कि), अगर मैं परीक्षण चलाने:

यहाँ क्या मेरी test/Makefile.am लगता है कि है कुछ भी स्थापित किए बिना, सब कुछ ठीक काम करता है। मैं स्थानीय रूप से परिवर्तन कर सकता हूं और उन्हें तुरंत इन कार्यक्रमों द्वारा उठाया जाता है।

मैं पैकेज स्थापित करते हैं, तो इन कार्यक्रमों संकलन होगा (ऐसा लगता है जैसे कि यह वास्तव में हेडर के लिए स्थानीय स्तर पर दिखता है), लेकिन यह याद आ रही प्रतीकों के बारे में शिकायत एक बार मैं इस कार्यक्रम चलाते हैं।

जहां तक ​​मैं कह सकता हूं, यह मेक आउटपुट के आधार पर नव निर्मित लाइब्रेरी (../src/libgdata.la) के खिलाफ जुड़ा हुआ है, इसलिए मुझे यकीन नहीं है कि यह क्यों हो रहा है। अगर मैं स्थापित फाइलों को हटा देता हूं, तो src/* में स्थानीय परिवर्तनों को ठीक से उठाया जाता है।

मैं नीचे gdatacalendar के लिए मेकअप उत्पादन शामिल किया है।

g++ -DHAVE_CONFIG_H -I. -I.. -I../src/ -I../test/ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -MT gdatacalendar.o -MD -MP -MF .deps/gdatacalendar.Tpo -c -o gdatacalendar.o gdatacalendar.cc 
mv -f .deps/gdatacalendar.Tpo .deps/gdatacalendar.Po 
/bin/bash ../libtool --tag=CXX --mode=link g++ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -L/home/altern8/workspaces/4355/dev-install/lib -lapiutil -lcurl -lgssapi_krb5 -lxml++-2.6 -lxml2 -lglibmm-2.4 -lgobject-2.0 -lsigc-2.0 -lglib-2.0 -o gdatacalendar gdatacalendar.o ../src/libgdata.la 
mkdir .libs 
g++ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -o .libs/gdatacalendar gdatacalendar.o -L/home/altern8/workspaces/4355/dev-install/lib /home/altern8/workspaces/4355/dev-install/lib/libapiutil.so /usr/lib/libcurl.so -lgssapi_krb5 /usr/lib/libxml++-2.6.so /usr/lib/libxml2.so /usr/lib/libglibmm-2.4.so /usr/lib/libgobject-2.0.so /usr/lib/libsigc-2.0.so /usr/lib/libglib-2.0.so ../src/.libs/libgdata.so -Wl,--rpath -Wl,/home/altern8/workspaces/4355/dev-install/lib 
creating gdatacalendar 

सहायता। :)

अद्यतन

मैं निम्न संदेश मिलता है जब मैं जब मैं के बाद मैं addCommonRequestHeader() विधि के बिना पुस्तकालय स्थापित किया था सेवा वर्ग के लिए addCommonRequestHeader() विधि जोड़ दिया है कैलेंडर कार्यक्रम चलाने के लिए प्रयास करें।

/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar: 
symbol lookup error: 
/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar: 
undefined symbol: 
_ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_ 

यूजीन के सुझाव की स्थापना $LD_LIBRARY_PATH चर मदद नहीं की कोशिश करने के लिए।

अद्यतन 2

मैं दो परीक्षण किया था। सबसे पहले, मैं अपने देव-स्थापित निर्देशिका (उपसर्ग) दूर उड़ाने के बाद ऐसा किया और कहा कि मामले में, यह test/.libs/lt-gdatacalendar पैदा करता है। एक बार जब मैंने लाइब्रेरी स्थापित की है, तो, यह इसके बजाय test/.libs/gdatacalendar बनाता है।

# before install 
# ldd test/.libs/lt-gdatacalendar 
libgdata.so.0 => /home/altern8/workspaces/4355/libgdata/src/.libs/libgdata.so.0 (0xb7c32000) 

# after install 
# ldd test/.libs/gdatacalendar 
libgdata.so.0 => /home/altern8/workspaces/4355/dev-install/lib/libgdata.so.0 (0xb7c87000) 

क्या इस एक मामले लेकिन दूसरे में gdatacalendar में LT-gdatacalendar बनाने के लिए कारण होगा: ldd के उत्पादन में एक अपवाद के साथ दोनों के लिए एक ही है?

libgdata पर ldd के उत्पादन में है:

[email protected]:~/workspaces/4355/libgdata$ ldd /home/altern8/workspaces/4355/libgdata/src/.libs/libgdata.so.0 
     linux-gate.so.1 => (0xb7f7c000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7f3b000) 
     libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7dec000) 
     /lib/ld-linux.so.2 (0xb7f7d000) 
+0

आप भी अपने सभी libs पर ldd LT-gdatacalendar – Eugene

+0

के उत्पादन में और फिर ldd के उत्पादन में पोस्ट कर सके – Eugene

+0

हम्म, क्या इस lt- उपसर्ग वास्तव में है? – Eugene

उत्तर

1

सुनिश्चित नहीं हैं कि क्या करना autoconf में करने के लिए कैसे, लेकिन अंतिम आदेश एल ../ src है की जरूरत हो सकती है, इसलिए लिंकर पहले नव निर्मित पुस्तकालय पा सकते हैं ।

मैन्युअल रूप से उस अतिरिक्त के साथ अंतिम कमांड चलाने का प्रयास करें और देखें कि क्या इससे मदद मिलती है।

संपादित करें: ठीक है, मुझे लगता है कि यह गलत है, सोचा था कि यह लिंक नहीं कर रहा था, लेकिन आप इसे लिंक कह रहे हैं लेकिन नहीं चलते?

यदि ऐसा है, तो अपनी बाइनरी पर ldd चलाएं और देखें कि यह किस तरह से उठाता है - अधिकतर स्थापित (और पुराना)।

इस मामले में, या तो चलने से पहले अद्यतन libs इंस्टॉल करें, या चलाने से पहले LD_LIBRARY_PATH env चर निर्यात करें।

export LD_LIBRARY_PATH="/path to freshly built libs" 
+0

सलाह के लिए धन्यवाद, लेकिन यह किसी की मदद नहीं कर रहा था। –

1

मुझे पता है कि निर्भरता ठीक से कार्य करने के लिए, आप LDADD में एक रिश्तेदार पथ के साथ libgdata.la का उल्लेख करने की जरूरत है; यह संभव है कि आप जिस स्थिति का वर्णन कर रहे हैं उसे प्रभावित करता है।

मुझे यकीन नहीं है कि क्यों, हालांकि। जिस व्यवहार का आप वर्णन कर रहे हैं वह थोड़ा अजीब लगता है; और शायद libtool डेवलपर्स को रिपोर्टिंग लायक है।

2

मुझे लगता है कि मैंने इसे हल किया है।

समस्या यह होनी चाहिए कि libtool "../scc/libgdata.so" भाग को देखने से पहले कमांड लाइन में "-L" ध्वज को देखता है। इस मामले में, यह उस "-एल" पथ के लिए "-Wl, -rpath, ..." के साथ लिंकर निष्पादित करता है। यदि उस पथ में "libgdata.so" है, तो इसका हमेशा उपयोग किया जाएगा, जो यहां है।

मेरे मामले में, मैं इस तरह पसंद करने के लिए "prog_LDADD" पुन: व्यवस्थित किया है: "prog_LDADD = $ (top_builddir) /src/my_lib.so $ (DEPENDENCY_LIBS)"

आपके मामले में, हटाने का प्रयास AM_LDFLAGS और लिखें:

LDADD = $ (top_builddir) /src/libgdata.la $ (APIUTIL_LIBS)

+0

मुझे इस परियोजना पर वापस आने पर यह प्रयास करना होगा। मेरा वर्कअराउंड (जो * बहुत * गंदा था) स्थिर पुस्तकालय से जुड़ा हुआ था: एलडीएडीडी = $ (top_builddir) /src/.libs/libgdata.a यह केवल स्वीकार्य था क्योंकि यह परीक्षण निर्देशिका के लिए था। –

+0

इससे मेरी मदद नहीं हुई। –

0

बिना -no-स्थापित libtool स्क्रिप्ट रैपर बनाता है और .libs/subdir में निष्पादनयोग्य डालता है (के साथ जुड़ा हुआ पुस्तकालय स्थापित)। रैपर को कॉल करने से आपके निष्पादन योग्य लोड/लिंक को आपके स्थानीय (स्थापित नहीं) लाइब्रेरी के साथ बनाया जाता है - इसलिए सब कुछ ठीक काम करता है, उदा। make check स्थापित नहीं है लेकिन आपकी ताजा बेक्ड लाइब्रेरी का परीक्षण नहीं करता है।

कुछ मामलों में (उदा। जब डीबगिंग या वाल्ग्रिंडिंग), तो आप उन रैपर नहीं लेना चाहते हैं, लेकिन वास्तविक निष्पादन योग्य सीधे आपकी स्थानीय लाइब्रेरी से जुड़े हुए हैं। इसके लिए आप AM_LDFLAGS = -no-install का उपयोग करें (या केवल इसे एकल लक्ष्य के लिए सेट करें)।

अधिक जानकारी here

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