2012-07-28 35 views
10

के साथ libtool का उपयोग करते समय मेरे पास एक सी ++ प्रोजेक्ट है जो लिंक बनाने के लिए अपनी बिल्ड स्क्रिप्ट और libtool के लिए जीएनयू Autotools का उपयोग करता है। हाल ही में मैं यह सुनिश्चित करना कि"छिपे हुए प्रतीक 'एटएक्सिट' को डीएसओ द्वारा संदर्भित किया जाता है" gcov

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage" 
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage" 

..get क्रमशः मेरी CFLAGS और LDFLAGS में शामिल द्वारा gcov साथ कोड कवरेज उपकरण जोड़ लिया है,। जी ++ - 4.2 (होमब्रू द्वारा स्थापित) का उपयोग कर ओएस एक्स 10.7.4 पर, सब कुछ ठीक काम करता है।

/bin/bash ./libtool --tag=CXX --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/locale_test myproj/inttests/locale_test.o myproj/app/libapp.la -lboost_thread-mt -lboost_system-mt -pthread -llog4cplus 
libtool: link: g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/.libs/locale_test myproj/inttests/locale_test.o -pthread -L/usr/local/lib myproj/app/.libs/libapp.so -lboost_thread-mt -lboost_system-mt /usr/lib/liblog4cplus.so -pthread 
/usr/bin/ld: myproj/inttests/.libs/locale_test: hidden symbol `atexit' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS) is referenced by DSO 
/usr/bin/ld: final link failed: Bad value 
collect2: ld returned 1 exit status 
make[2]: *** [myproj/inttests/locale_test] Error 1 

मैं कैसे ubuntu/जी ++ 4.6 पर अपने निर्माण ठीक करते हैं:

Ubuntu 12.04 पर जी ++ 4.6.3 का उपयोग कर, libtool मेरी परीक्षणों में से एक लिंक करने के लिए विफल रहता है?

उत्तर

5

आसपास googling बाद मैं this thread देखते हैं, जो CXXFLAGS करने के लिए --coverage जोड़ने का सुझाव देता है जब ./configure चल रहा है। दरअसल, हालांकि यह है कि पोस्टर के लिए काम नहीं किया, यह मेरे लिए काम करता है:

./configure CXXFLAGS="--coverage" 

हालांकि इस चर पैकेज संस्थापक के लिए आरक्षित है, नहीं मेंटेनर (। मुझे) प्रश्न के "मैं कैसे शामिल है कम कर देता है यह ठीक से निर्माण में? "

यहाँ क्या नहीं काफी है:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage" 
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage" 

धारणा है कि GCOV_CFLAGS प्रभावी CXXFLAGS में शामिल हो जाता है पर (नहीं दिखाया गया है, लेकिन यह करता है), ऐसा लगता है जैसे यह सुधार कार्य करना चाहिए। यह नहीं है

आगे बढ़ते हुए, ऐसा लगता है कि हमें कम से कम कुछ कर्षण प्राप्त करना चाहिए यदि हम कमांड लाइन से CXXFLAGS="--coverage" छोड़ दें और इसके बजाय इसे configure.ac पर रखें। यह वास्तव में काम नहीं करता है जब तक कि लाइन AC_PROG_CXX कॉल से ऊपर रखी गई है जो संकलक का चयन करती है।

तो अब हम थोड़ा अंतर्दृष्टि प्राप्त करते हैं। AC_PROG_CXX--coverage देखता है जब कुछ बदल रहा है, जो कि GCOV_CFLAGS में प्लेसमेंट काम नहीं करता है: यह बहुत देर हो चुकी थी।

लॉग के माध्यम से ध्यान से देखकर, ऐसा लगता है कि गुप्त सॉस असफल लिंकिंग चरण में -lgcov का स्वचालित समावेशन है। मुझे यकीन है कि इस पुस्तकालय में इस तरह के एक गुप्त होने की जरूरत नहीं कर रहा हूँ, लेकिन अगर मैं इतना के रूप में अपने चर बदलने के लिए:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage" 
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage" 
GCOV_LIBS="-lgcov" 

..और सुनिश्चित GCOV_LIBSLIBS में शामिल है, तो यह सब काम करता है, मेरे सभी प्लेटफार्मों पर।

EDIT: this thread भी देखें।

+0

क्या आप मैन्युअल रूप से इन जीसीओवी * वर्र्स को अन्य चरों में काम करते हैं या वे स्वचालित रूप से शामिल होते हैं? यदि आप उन्हें मैन्युअल रूप से दूसरों में रखते हैं, तो आप उन्हें किस स्थान पर रखते हैं? – dbeer

+0

असल में, ऐसा लगता है कि मेरी स्क्रिप्ट का वर्तमान संस्करण अभी तक एक तिहाई चीज है। Https://github.com/phs/sauce/blob/master/Makefile पर एक नज़र डालें।हूँ ('GCOV_ENABLED' के लिए 'config.ac' देखें) – phs

+1

यह टिप्पणी आपको रिडंडेंसी विभाग विभाग द्वारा लाया गया। '--coverage' लिंकिंग करते समय संकलन और' -lgcov' के दौरान '-फ्रोफाइल-आर्क--फ़ेस्ट-कवरेज' के बराबर है। – Bulletmagnet

0

अधिक सामान्य तरीके से, यह त्रुटि यह सुनिश्चित करके तय की जा सकती है कि आपके पुस्तकालयों को आपकी लिंक कमांड लाइन पर ठीक से आदेश दिया गया हो।