"إخفاء رمز `atexit' يتم الإشارة إليها بواسطة الواحة" عند استخدام libtool مع gcov

StackOverflow https://stackoverflow.com//questions/11703709

سؤال

لدي C++ المشروع الذي يستخدم جنو Autotools أجل بناء النصوص libtool ربط.في الآونة الأخيرة لقد تم إضافة رمز تغطية الأجهزة مع gcov من خلال ضمان أن

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

..الحصول على المدرجة في بلدي CFLAGS و LDFLAGS على التوالي.على OS X 10.7.4 باستخدام g++-4.2 (تثبيت البيرة), كل شيء يعمل بشكل جيد.

على أوبونتو 12.04 باستخدام g++ 4.6.3, libtool فشل في رابط واحد من الاختبارات:

/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

كيف يمكنني إصلاح جهاز بناء على أوبونتو/g++ 4.6?

هل كانت مفيدة؟

المحلول

بعد غوغلينغ حول أرى هذا الموضوع, مما يوحي إضافة --coverage إلى CXXFLAGS عند تشغيل ./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_LIBS يتم تضمينها في LIBS, ثم كل شيء يعمل على جميع المنصات.

تحرير:انظر أيضا هذا الموضوع.

نصائح أخرى

بطريقة أكثر واقعية، يمكن إصلاح هذا الخطأ عن طريق التأكد من طلب مكتباتك بشكل صحيح على سطر أوامر الرابط الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top