2009-02-19 38 views
51

Tôi đang cố gắng để biên dịch một ứng dụng đơn giản với gcov và nhận được các lỗi liên kết sau đây:Biểu tượng gcov ở đâu?

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest 
AllTests.o: In function `global constructors keyed to 0_RunAllTests': 
/home/p7539c/cutest/AllTests.c:26: undefined reference to `__gcov_init' 
AllTests.o:(.data+0x44): undefined reference to `__gcov_merge_add' 
CuTestTest.o: In function `global constructors keyed to 0_TestCuStringNew': 
/home/p7539c/cutest/CuTestTest.c:30: undefined reference to `__gcov_init' 
CuTestTest.o:(.data+0x64): undefined reference to `__gcov_merge_add' 
CuTest.o: In function `global constructors keyed to 0_CuStrAlloc': 
/home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init' 
CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add' 
collect2: ld returned 1 exit status 
make: *** [TestTest] Error 1 

tôi dường như không thể tìm thấy vị trí của những biểu tượng mất tích. gcov hiện diện trên máy chạy phiên bản gcc 4.1.2

Bất kỳ ý tưởng nào? Cảm ơn.

Chỉnh sửa:

Mọi thứ dường như hoạt động tốt khi sử dụng gcov với ứng dụng bao gồm một tệp .c. Khi tôi có nhiều tệp .c (do đó nhiều tệp .o) tôi có vấn đề ở trên.

Các bước biên dịch trông giống như sau:

cc -fprofile-arcs -ftest-coverage -g -c -o AllTests.o AllTests.c 
cc -fprofile-arcs -ftest-coverage -g -c -o CuTestTest.o CuTestTest.c 
cc -fprofile-arcs -ftest-coverage -g -c -o CuTest.o CuTest.c 

Trả lời

5

Tôi đã thử một tập tin thử nghiệm đơn giản với gcc -ftest-coverage -fprofile-arcs test.c và không có vấn đề như bạn mô tả.

Tôi nghi ngờ gcc sẽ mang thư viện gcov nếu cờ -ftest-coverage có khi liên kết. Hãy thử vượt qua lá cờ đó trên dòng lệnh gcc của bạn.

+0

Đã thử rằng với một ứng dụng tệp duy nhất và nó hoạt động. Tôi gặp sự cố với ứng dụng nhiều tệp của mình. Nó biên dịch tốt, nhưng dường như có liên kết lẫn lộn. – john146

+0

p7539c @ localhost cutest> làm cho cc -fprofile-arcs -ftest-coverage -g -c -o AllTests.o AllTests.c cc -fprofile-arcs -ftest-coverage -g -c -o CuTestTest.o CuTestTest. c cc -fprofile-arcs -ftest-coverage -g -c -o CuTest.o CuTest.c gcc AllTests.o CuTestTest.o CuTest.o -o TestTest – john146

+2

Bạn vẫn không chuyển tham số phủ ngoài cuộc gọi cuối cùng tới gcc. Bạn cần phải xác định nó khi liên kết quá. – flodin

-1

Vì vậy, tôi đã thêm vào chia sẻ với CFLAGS và giờ đây có vẻ như nó hoạt động với nhiều tệp. Tất nhiên, nó đang ăn cắp ở một nơi xa lạ, nên tôi không biết đó là cái gì.

13

Cờ bạn đang tìm kiếm là -lgcov when linking. Đó là, sự thay đổi:

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest 

để

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest 
+12

-profile-arcs ngụ ý -lgcov – slicedlime

+4

Rõ ràng không phải lúc nào. Xem http://stackoverflow.com/q/11703709/580412 – phs

+1

Cũng có thể sử dụng '--coverage' thay vì' -lgcov' làm cờ liên kết. – MKroehnert

69

tôi chỉ cần bỏ ra một khoản tiền đáng kinh ngạc của thời gian gỡ lỗi một lỗi rất giống nhau. Dưới đây là những gì tôi đã học:

  • Bạn phải vượt qua -fprofile-arcs -ftest-coverage khi biên dịch.
  • Bạn phải vượt qua -fprofile-arcs khi liên kết.
  • Bạn vẫn có thể gặp lỗi liên kết lạ khi liên kết. Họ sẽ trông như thế này:

    libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'

Điều này có nghĩa rằng gconv là có vấn đề với một trong những nhà xây dựng trình biên dịch tạo của bạn (trong trường hợp của tôi, một bản sao-constructor). Kiểm tra chức năng được đề cập trong thông báo lỗi, xem các loại đối tượng mà nó sao chép-xây dựng và xem có bất kỳ lớp nào trong số các lớp đó không có một hàm tạo bản sao hay không. Thêm một và lỗi sẽ biến mất.

Chỉnh sửa: Việc bạn có tối ưu hóa hay không cũng có thể ảnh hưởng đến điều này. Thử bật/tắt tối ưu hóa nếu bạn gặp sự cố với nó.

+0

Câu trả lời này phù hợp với tôi. – Zitrax

+1

Công trình này đẹp mắt. Cảm ơn bạn đã thực hiện số lần gỡ lỗi đáng kinh ngạc của mình. – Wyatt

+1

Định cấu hình phần mềm bằng "CFLAGS =" - O0 -fprofile-arc-phạm vi phủ sóng "LDFLAGS =" - fprofile-arcs "./configure " dường như thực hiện thủ thuật cho tôi. Cảm ơn. – oherrala

7

Tôi đã tìm thấy, as suggested here, bổ sung thêm -lgcov vào dây chuyền xây dựng khi xây dựng một thư viện được chia sẻ .oó được xây dựng với -fprofile-arc -ftest-coverage đã giải quyết vấn đề này cho tôi. Và tất nhiên liên kết thực thi với -lgcov.Xây dựng các thư viện chia sẻ như vậy:

g++ -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov 

Và thực thi như sau:

g++ -o myExec myMain.o -lMyLib -lgcov 

Thêm -lgov để xây dựng các thư viện chia sẻ (không chỉ là exe), giải quyết lỗi bổ sung này cho tôi:

hidden symbol `__gcov_merge_add' in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov_merge_add.o) is referenced by DSO 
/usr/bin/ld: final link failed: Nonrepresentable section on output 

Xin lưu ý rằng -lgcov phải là thư viện được liên kết cuối cùng.

+0

Tuyệt vời. Tôi đã cố gắng thêm thông tin mới khi nhà phát triển sử dụng CMake nhưng Chỉnh sửa được đề xuất bị từ chối ... cảm ơn các bạn. – Tarod

+1

Tôi muốn viết lời giải thích tiếp theo trong câu trả lời.Dù sao, với CMake, bạn có thể nhận được cùng một hành vi thêm 'target_link_libraries ($ {LIBRARY_NAME} gcov)' sau 'target_link_libraries ($ {LIBRARY_NAME} gcov)' – Tarod

+0

Điều này sẽ hoạt động. Chưa thử, tôi sẽ cập nhật phản hồi của mình sau khi tôi thử. –

1

vĩ đại Max Lybbert, Về cơ bản trong trường hợp sử dụng autoconf thêm _LDADD = -lgcov ...

này sẽ giải quyết vấn đề này.

11

Bạn sẽ chỉ có thể chỉ định --coverage trên dòng lệnh khi biên dịch và liên kết.

Theo man gcc:

Các tùy chọn là một từ đồng nghĩa với -fprofile-arcs-ftest-coverage (khi biên dịch) và -lgcov (khi kết nối).

2

Có lẽ rõ ràng, thông báo lỗi chính xác này được tạo ra khi liên kết với một liên kết không phải gcc. Chúng tôi thấy lỗi này khi liên kết với ifort (vì mã của chúng tôi bao gồm cả mô-đun Fortran và C). Chuyển sang liên kết với gcc đã thực hiện thủ thuật.

+0

Vì các trình liên kết khác không nhận ra tùy chọn '-fprofile-arcs' – Mawg

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