"إخفاء رمز `atexit' يتم الإشارة إليها بواسطة الواحة" عند استخدام libtool مع gcov
سؤال
لدي 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
, ثم كل شيء يعمل على جميع المنصات.
تحرير:انظر أيضا هذا الموضوع.
نصائح أخرى
بطريقة أكثر واقعية، يمكن إصلاح هذا الخطأ عن طريق التأكد من طلب مكتباتك بشكل صحيح على سطر أوامر الرابط الخاص بك.