매우 간단한 프로그램의 컴파일을 테스트하려고 할 때 다음 오류가 발생합니다.
#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