gcov와 함께 libtool을 사용할 때 "숨겨진 기호 `atexit'가 DSO에서 참조됩니다."

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

문제

빌드 스크립트에는 GNU Autotools를 사용하고 연결에는 libtool을 사용하는 C++ 프로젝트가 있습니다.최근에 나는 gcov에 코드 적용 범위 계측을 추가했습니다.

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

..내 목록에 포함되세요 CFLAGS 그리고 LDFLAGS 각기.g++-4.2(homebrew로 설치)를 사용하는 OS X 10.7.4에서는 모든 것이 잘 작동합니다.

g++ 4.6.3을 사용하는 Ubuntu 12.04에서 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

ubuntu/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