![g++를 사용할 때 ld 오류 "/opt/bin/ld: /lib/libm.so.6을 검색할 때 호환되지 않는 /lib/libm.so.6을 건너뜁니다"](https://rvso.com/image/83695/g%2B%2B%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20ld%20%EC%98%A4%EB%A5%98%20%22%2Fopt%2Fbin%2Fld%3A%20%2Flib%2Flibm.so.6%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%A0%20%EB%95%8C%20%ED%98%B8%ED%99%98%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%2Flib%2Flibm.so.6%EC%9D%84%20%EA%B1%B4%EB%84%88%EB%9C%81%EB%8B%88%EB%8B%A4%22.png)
매우 간단한 프로그램 컴파일을 테스트하려고 할 때 다음 오류가 발생합니다.
#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++
링커 단계에 자동이 추가 되면 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