gcov 기호는 어디에 있습니까?
gcov로 간단한 앱을 컴파일하고 다음과 같은 링크 오류가 발생합니다.
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
누락 된 기호의 위치를 찾을 수없는 것 같습니다. gcov는 gcc 버전 4.1.2를 실행하는 시스템에 있습니다.
어떤 아이디어? 감사.
편집시 :
하나의 .c 파일로 구성된 응용 프로그램에서 gcov를 사용할 때 모든 것이 잘 작동하는 것 같습니다. 여러 .c 파일 (따라서 여러 .o 파일)이있을 때 위의 문제가 있습니다.
컴파일 단계는 다음과 같습니다.
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
매우 유사한 오류를 디버깅하는 데 엄청난 시간을 보냈습니다. 내가 배운 내용은 다음과 같습니다.
-fprofile-arcs -ftest-coverage
컴파일 할 때 통과해야합니다 .-fprofile-arcs
연결할 때 통과해야합니다 .연결할 때 여전히 이상한 링커 오류가 발생할 수 있습니다. 다음과 같이 표시됩니다.
libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'
이것은 gconv가 컴파일러 생성 생성자 중 하나 (제 경우에는 복사 생성자)에 문제가 있음을 의미합니다. 오류 메시지에 언급 된 함수를 확인하고 복사 생성하는 객체의 종류를 확인하고 해당 클래스에 복사 생성자가 없는지 확인합니다. 하나를 추가하면 오류가 사라집니다.
편집 : 최적화 여부도 이에 영향을 미칠 수 있습니다. 문제가있는 경우 최적화를 켜거나 끄십시오.
찾고있는 플래그는 링크 할 때 -lgcov 입니다. 즉, 변경 :
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
...에
gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
내가 발견 여기에 제안 , .o 인이 -ftest-범위가 나를 위해이 해결 -fprofile-호를 탑재함으로써이 포함 된 공유 라이브러리를 빌드 할 때 빌드 라인에 -lgcov 및 추가. 물론 실행 파일을 -lgcov와 연결합니다. 다음과 같이 공유 라이브러리를 구축했습니다.
g++ -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov
그리고 다음과 같은 실행 파일 :
g++ -o myExec myMain.o -lMyLib -lgcov
-lgov를 공유 라이브러리 (exe뿐만 아니라) 빌드에 추가하면이 추가 오류가 해결되었습니다.
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
-lgcov는 마지막으로 링크 된 라이브러리 여야합니다.
--coverage
컴파일 및 링크 할 때 명령 줄 에서만 지정할 수 있어야합니다 .
에 따르면 man gcc
:
이 옵션은
-fprofile-arcs
-ftest-coverage
(컴파일 할 때) 및-lgcov
(링크 할 때 ) 의 동의어입니다 .
나는 간단한 테스트 파일을 시도했고 gcc -ftest-coverage -fprofile-arcs test.c
당신이 설명하는 것과 같은 문제가 없었습니다.
-ftest-coverage
링크 할 때 플래그가 있으면 gcc가 gcov 라이브러리를 가져 오는 것으로 의심 됩니다. gcc 명령 줄에서 해당 플래그를 전달해보십시오.
아마도 gcc가 아닌 링커와 연결할 때이 정확한 오류 메시지가 생성 될 것입니다. ifort와 연결할 때이 오류가 표시됩니다 (코드에 Fortran 및 C 모듈이 모두 포함되어 있기 때문). gcc와의 연결로 전환하는 것이 트릭이었습니다.
Great Max Lybbert, 기본적으로 autoconf 사용의 경우 add _LDADD = -lgcov ...
이것은 문제를 해결할 것입니다.
그래서 CFLAGS에 -shared를 추가했는데 이제 여러 파일에서 작동하는 것 같습니다. 물론 이상한 곳에서 코어 링을하고있어서 그게 뭔지 아직 모르겠습니다.
참고 URL : https://stackoverflow.com/questions/566472/where-are-the-gcov-symbols
'Program Tip' 카테고리의 다른 글
R3.3 용 udunits2 패키지 설치 (0) | 2020.12.11 |
---|---|
ListBox 항목에 대한 DataTemplate의 IsSelected에 대한 WPF 트리거 (0) | 2020.12.11 |
C # 코드에서 wpf의 ResourceDictionary에 어떻게 액세스 할 수 있습니까? (0) | 2020.12.11 |
Html Agility Pack은 여전히 최고의 .NET HTML 파서입니까? (0) | 2020.12.11 |
InnoDB가 테이블 / 테이블에서 외래 키를 다시 확인하도록 강제합니까? (0) | 2020.12.11 |