g++를 사용할 때 ld 오류 "/opt/bin/ld: /lib/libm.so.6을 검색하는 중 호환되지 않는 /lib/libm.so.6을 건너뛰는 중"

g++를 사용할 때 ld 오류 "/opt/bin/ld: /lib/libm.so.6을 검색하는 중 호환되지 않는 /lib/libm.so.6을 건너뛰는 중"

매우 간단한 프로그램의 컴파일을 테스트하려고 할 때 다음 오류가 발생합니다.

#ifdef __cplusplus
extern "C"
#endif
int
main ()
{
return 0;
}

g++를 사용하여 컴파일하면 다음과 같은 오류 메시지가 나타납니다.

g++ -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp

/opt/bin/ld: skipping incompatible /lib/libm.so.6 when searching for /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libm.so.6
/opt/bin/ld: cannot find /lib/libmvec.so.1

그러나 gcc는 다음을 컴파일하고 전달합니다.

gcc -o conftest -I/opt/include -L/opt/lib -Wl,--library-path=opt/lib testconftest.cpp

시스템은 32비트와 64비트가 혼합되어 있으며 모든 32비트 프로그램과 라이브러리는 /lib, /bin, /sbin 등에 있습니다. 모든 64비트 프로그램과 라이브러리는 /opt/lib, /opt/bin, opt/sbin 등에 있습니다. /lib/libm.so.6은 잘못된 버전이고 수정된 버전은 /opt/lib에 있다는 것을 알고 있습니다. . 또한 gcc, g++, ld는 모두 64비트이며 /opt 하위 폴더에 있으며, 기타 복잡한 프로그램도 gcc를 사용하여 성공적으로 컴파일되었습니다. /lib/libm.so.6 파일은 /lib/libm-2.6.1.so에 대한 심볼릭 링크입니다. /opt/lib/lim.so.6 파일은 /opt/lib/libm-에 대한 심볼릭 링크입니다. 2.22.so*

file /opt/lib/libm-2.22.so
/opt/lib/libm-2.22.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, for GNU/Linux 2.6.32, stripped

file /lib/libm-2.6.1.so
/lib/libm-2.6.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.8, stripped

g++ --version
g++ (OpenWrt GCC 4.8.5) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

답변1

귀하가 겪고 있는 문제를 재현할 수 없기 때문에 몇 가지 제안만 드릴 수 있습니다.

확인 해봐답변g++을 사용하면 링커 단계에서 일부 추가 라이브러리가 자동으로 추가되기 때문입니다 . -v포함된 라이브러리를 보다 명확하게 파악하기 위해 컴파일/링크할 때 이 옵션을 사용할 수 있습니다 .

-v 실행 컴파일 단계 동안 실행된 명령을 표준 오류 출력에 인쇄합니다. 또한 컴파일러 드라이버, 전처리기 및 컴파일러 자체의 버전 번호를 인쇄합니다.

g++링커 단계에 auto가 추가 되면 libstdc++경로에서 선언된 위치를 살펴보세요.

$  ldconfig -p | grep stdc++
    libstdc++.so.6 (libc6,x86-64) => /usr/lib64/libstdc++.so.6
    libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6

관련 정보