2009-06-20 10 views
10

मैं जीएनयू/लिनक्स पर सी ++ प्रोजेक्ट पर काम कर रहा हूं और मैं ऑटोोटूल के साथ आईबीएम इनफॉर्मिक्स की लाइब्रेरी के अस्तित्व और उपयोगिता का परीक्षण करने का एक तरीका ढूंढ रहा हूं - अर्थात् configure.in संपादित करना। मुझे ऑटोटूल के साथ अनुभव नहीं है, इसलिए मूल रूप से मैं प्रोजेक्ट के configure.inet al से उठा रहा हूं। स्क्रिप्ट और प्रतिलिपि & बदल रहा है जहां मुझे लगता है कि मुझे बदलने की जरूरत है। IOW, मैं मौजूदा पाठ से configure.in में अनुकूलन कर रहा हूं।config.in में सी ++ लाइब्रेरी उपयोगिता का परीक्षण कैसे करें?

अब तक मैं AC_CHECK_LIBconfigure.in में सफलतापूर्वक उपयोग कर रहा हूं यह जांचने के लिए कि कोई निश्चित लाइब्रेरी मौजूद है और उपयोग योग्य है या नहीं। लेकिन यह केवल फ़ंक्शंस के साथ पुस्तकालयों के साथ काम करता प्रतीत होता है, उदाहरण के लिए नहीं कक्षाएं। अर्थात्, इस जब इन्फोर्मिक्स के libifc++.so पुस्तकालय का परीक्षण विफल रहता है:

AC_CHECK_LIB(ifc++, ITString, 
     INFORMIX_LIB="-L$INFORMIX_LIB_LOCATION/c++ -lifc++ -L$INFORMIX_LIB_LOCATION -L$INFORMIX_LIB_LOCATION/dmi -L$INFORMIX_LIB_LOCATION/esql -lifdmi -lifsql -lifasf -lifgen -lifos -lifgls -lifglx $INFORMIX_LIB_LOCATION/esql/checkapi.o -lm -ldl -lcrypt -lnsl", 
     echo "* WARNING: libifc++.so not found!" 
     INFORMIX_INC="" 
     INFORMIX_LIB="" 
) 

मैं भी ITString::ITString की तरह अन्य संयोजन का उपयोग कर, की कोशिश की है, आदि

मैं इन्फोर्मिक्स के एपीआई में एक "शुद्ध" समारोह नहीं मिला है (यानी , एक जिसे सी ++ वर्ग में संदर्भित नहीं किया गया है)। तो मैं उम्मीद कर रहा हूं कि इस संदर्भ में AC_CHECK_LIB का उपयोग करने का कोई तरीका है, या इस विशिष्ट उपयोग के लिए autoconf/configure.in "कमांड" है।

आपकी प्रतिक्रिया के लिए अग्रिम धन्यवाद।

उत्तर

5

यह प्राप्त करने का एक क्लीनर तरीका हो सकता है, लेकिन मुझे लगता है कि आपकी समस्या यह है कि सी ++ विधियों को विधि के बारे में अतिरिक्त जानकारी (तर्क & रिटर्न प्रकार इत्यादि) को एन्कोड करने के लिए 'उलझन' मिलता है। उदाहरण के लिए; विधि int A::foo(void)__ZN1A3fooEv जैसी किसी चीज़ से उलझ जाएगी।

तो आपको लाइब्रेरी में किसी विधि का उलझन नाम ढूंढना होगा। आप यूनिक्स की तरह OS के पर nm command का उपयोग करके ऐसा कर सकते हैं:

$ nm libifc++.so | grep ITString 

यह उल्लेख है कि सटीक mangling प्रारूप विभिन्न compilers में भिन्न होती है लायक है; और इसलिए अपने configure.in में एक निश्चित कंपाइलर के उलझन वाले प्रतीक को एम्बेड करके यह अन्य प्लेटफार्मों पर काम नहीं कर सकता - वाईएमएमवी।

नोट: आप c++filt उपयोगिता का उपयोग किसी नाम को मानव-पठनीय रूप में वापस करने के लिए उपयोग कर सकते हैं; तो उदाहरण के लिए मैं पहले दिया:

$ c++filt __ZN1A3fooEv 
A::foo() 

अधिक जानकारी के लिए विकिपीडिया पर Name Mangling in C++ देखें।

+0

वर्क्स-लिए-Me। मैंने ऐसा कुछ करने के बारे में सोचा था, लेकिन यह एक हैक की तरह लग रहा था। उदाहरण के लिए, मुझे यकीन नहीं है कि क्या होता है यदि कोड को एक अलग इनफॉर्मिक्स लाइब्रेरी संस्करण के साथ पुन: संकलित किया जाता है (मुझे लगता है कि उलझन में नाम बदलने की उम्मीद है)। लेकिन हे, यह काम करता है! :-) – jbatista

+2

यह एक नए लाइब्रेरी संस्करण (क्लास और विधि नामों को बदलने में नहीं लगता है) के साथ काम करना जारी रखना चाहिए, लेकिन यदि आपका कंपाइलर संस्करण बदलता है तो टूट सकता है, और अगर कोई और आपके कोड को दूसरे पर संकलित करने का प्रयास करता है तो लगभग निश्चित रूप से तोड़ देगा कंपाइलर या कंपाइलर संस्करण। –

+0

@ टाइयलर - एक मान्य बिंदु; मैंने जवाब में इसे हाइलाइट किया है। – DaveR

13

आपने ऑटोोटूल की कमी की खोज की है, लेकिन एक जिसे वास्तव में मदद नहीं की जा सकती है। ऑटोटूल लाइब्रेरी बाइनरी में प्रतीक नामों के लिए जांच करता है, और सी के विपरीत जहां फ़ंक्शंस नामों के प्रतीक नाम फ़ंक्शन नामों के समान होते हैं, सी ++ "मैंगल्स" फ़ंक्शन के प्रतीक नाम फ़ंक्शन ओवरलोडिंग जैसी चीजों को पूरा करने के लिए होते हैं। इससे भी बदतर यह है कि सी ++ में वास्तव में "मानक" मैंगलिंग सम्मेलन भी नहीं है, इसलिए अलग-अलग सी ++ कंपाइलर एक ही फ़ंक्शन के लिए अलग-अलग प्रतीक नाम उत्पन्न कर सकते हैं। इस प्रकार, autotools विश्वसनीय तरीके से सी ++ प्रतीक नामों की जांच नहीं कर सकता है।

क्या लाइब्रेरी का उपयोग करने का प्रयास कर रहे हैं क्या आपके पास extern "C" के साथ घोषित किए गए कोई भी कार्य हैं? इससे C++ कंपाइलर मानक सी-शैली प्रतीक नाम उत्पन्न करने का कारण बनता है, और autotools उन्हें ढूंढ पाएंगे।

मैं Autotools साथ gtest और gmock (गूगल इकाई परीक्षण और मजाक चौखटे वस्तु) का पता लगाने की कोशिश कर इस मुद्दे में भाग, और यहाँ है कि मैं क्या के साथ आया है:

# gtest has a main function in the gtest_main library with C linkage, we can test for that. 
AC_CHECK_LIB([gtest_main], [main], [HAVE_GTEST=1] [TEST_LIBS="$TEST_LIBS -lgtest_main"], 
     AC_MSG_WARN([libgtest (Google C++ Unit Testing Framework) is not installed. Will not be able to make check.])) 

# gmock has no functions with C linkage, so this is a roundabout way of testing for it. We create a small test 
# program that tries to instantiate one of gmock's objects, and try to link it with -lgmock and see if it works. 
if test "$HAVE_GTEST"                 
then                     
    saved_ldflags="${LDFLAGS}"               
    LDFLAGS="${LDFLAGS} -lgtest -lgmock"             
    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <gmock/gmock.h>], [testing::Cardinality dummy])], 
    [TEST_LIBS="$TEST_LIBS -lgmock"] [HAVE_GMOCK=1],           
    [AC_MSG_WARN([libgmock (Google C++ Object Mocking Framework) is not installed. Will not be able to make check.])]) 
    LDFLAGS="${saved_ldflags}"                       
fi   
2

तो पुस्तकालय आप के लिए जाँच कर रहे हैं pkg-config का समर्थन करता है, यह बहुत आसान हो जाता है।

dnl ************************************ 
dnl Check for googletest and googlemock 
dnl ************************************ 

PKG_CHECK_MODULES(gtestmock, libgtest >= 0.4.0, libgmock >= 0.4.0) 
AC_SUBST(gtestmock_LIBS) 
AC_SUBST(gtestmock_CFLAGS) 

और कहीं मेरी Makefile.am में तो:

sometarget_CXXFLAGS = $(gtestmock_CFLAGS) $(AM_CXXFLAGS) 
sometarget_LDADD = $(gtestmock_LIBS) 

सुंदर तुच्छ, हाँ यहाँ सब मैं अपने configure.in को जोड़ा गया के लिए जाँच करें और gtest और gmock सक्षम करने के लिए है?

+0

[समस्याएं हैं] (http://stackoverflow.com/questions/10220946/pkg-check-modules-cononsidered-harmful/10229811#10229811) pkg-config का उपयोग करने के साथ, हालांकि। और, अधिक मौलिक रूप से, pkg-config और autotools एक अलग तरीके से काम करते हैं। Autoconf सुविधाओं के लिए जांच करता है, जबकि पैकेज संस्करणों के लिए pkg-config परीक्षण। यदि आप चीजों को ऑटोटूल तरीके से करने की कोशिश कर रहे हैं, जो आपको सिस्टम में अधिकतम संगतता प्रदान करे, तो मैं बिल्कुल पीकेजी-कॉन्फ़िगरेशन का उपयोग करने का सुझाव नहीं दूंगा। – edam

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