2012-07-28 29 views
10

Tôi có một dự án C++ sử dụng GNU Autotools cho các kịch bản xây dựng và libtool để liên kết. Gần đây tôi đã thêm mã vùng phủ sóng thiết bị đo đạc với gcov, bằng cách đảm bảo rằng"Biểu tượng ẩn` atexit 'được tham chiếu bởi DSO "khi sử dụng libtool với gcov

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

..get trong CFLAGS tôi và LDFLAGS tương ứng. Trên OS X 10.7.4 sử dụng g ++ - 4.2 (được cài đặt bởi homebrew), mọi thứ hoạt động tốt.

Trên Ubuntu 12.04 sử dụng g ++ 4.6.3, libtool thất bại trong việc liên kết một trong những thử nghiệm của tôi:

/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 

Làm thế nào để sửa chữa xây dựng của tôi trên ubuntu/g ++ 4.6?

Trả lời

5

Sau khi googling xung quanh, tôi thấy this thread, đề xuất thêm --coverage thành CXXFLAGS khi chạy ./configure. Trên thực tế, mặc dù nó không làm việc cho tấm áp phích đó, nó làm việc cho tôi:

./configure CXXFLAGS="--coverage" 

Tuy nhiên biến này được dành riêng cho trình cài đặt gói, không phải là nhà duy trì (. Tôi) Câu hỏi đặt ra giảm đến "Làm thế nào để kết hợp điều này vào xây dựng đúng cách? "

Dưới đây là không đủ là những gì:

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

Trên giả định rằng GCOV_CFLAGS được đưa vào hiệu quả CXXFLAGS (không hiển thị, nhưng nó), nó có vẻ như sửa chữa nên làm việc. Nó không.

Đào sâu hơn nữa, có vẻ như chúng ta nên ít nhất có được lực kéo nếu chúng ta thả CXXFLAGS="--coverage" từ dòng lệnh và thay vào đó đặt nó trong configure.ac ở đâu đó. Điều này, trên thực tế, cũng không hoạt động trừ khi dòng được đặt phía trên lệnh gọi AC_PROG_CXX chọn trình biên dịch.

Vì vậy, bây giờ chúng tôi có được một chút thông tin chi tiết. AC_PROG_CXX đang thay đổi một cái gì đó khi nó thấy --coverage, rất có thể là lý do tại sao vị trí trong GCOV_CFLAGS không hoạt động: đã quá muộn.

Tìm kiếm cẩn thận thông qua nhật ký, có vẻ như nước sốt bí mật là sự bao gồm tự động -lgcov trong bước liên kết không thành công. Tôi không chắc chắn thư viện này cần thiết để trở thành một bí mật như vậy, nhưng nếu tôi thay đổi biến tôi như vậy:

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

..và đảm bảo GCOV_LIBS được bao gồm trong LIBS, sau đó nó tất cả các công trình, trên tất cả các nền tảng của tôi.

EDIT: Xem thêm this thread.

+0

Bạn có làm việc thủ công các GCOV * vars này thành các biến khác hoặc chúng tự động được đưa vào không? Nếu bạn đặt chúng vào người khác theo cách thủ công, bạn đặt chúng vào đâu? – dbeer

+0

Thực ra, có vẻ như phiên bản hiện tại của tập lệnh của tôi vẫn là một điều thứ ba. Xem nhanh https://github.com/phs/sauce/blob/master/Makefile.am (xem 'configure.ac' cho' GCOV_ENABLED') – phs

+1

Nhận xét này được đưa ra bởi Bộ phận Dự phòng. '--coverage' tương đương với' -fprofile-arcs -ftest-coverage' trong khi biên dịch và '-lgcov' trong khi liên kết. – Bulletmagnet

0

Một cách chung chung hơn, lỗi này có thể được khắc phục bằng cách đảm bảo thư viện của bạn được sắp xếp đúng cách trên dòng lệnh liên kết của bạn.

Các vấn đề liên quan