ARM용 gcc를 크로스 컴파일하려고 합니다. 그러면 기존 gcc ARM 크로스 컴파일러가 업데이트됩니다. libgcc1이 성공적으로 빌드된 후 libstdc++ 빌드가 시작될 때까지 빌드는 정상적으로 실행됩니다.
오류는 다음과 같습니다
<gcc-object-path>/./gcc/xgcc -shared-libgcc -B<gcc-object-path>/./gcc -nostdinc++ -L<gcc-object-path>/<target>/libstdc++-v3/src -L<gcc-object-path>/<target>/libstdc++-v3/src/.libs -L<gcc-object-path>/<target>/libstdc++-v3/libsupc++/.libs -B<sysroot>/<target>/bin/ -B<sysroot>/<target>/lib/ -isystem <sysroot>/<target>/include -isystem <sysroot>/<target>/sys-include --sysroot=<boot-strap-xgcc-sysroot> -x c++-header -nostdinc++ -g -Os -I<gcc-object-path>/<target>/libstdc++-v3/include/<target> -I<gcc-object-path>/<target>/libstdc++-v3/include -I<gcc-source-path>/libstdc++-v3/libsupc++ -O2 -g -std=gnu++0x <gcc-source-path>/libstdc++-v3/include/precompiled/stdc++.h \
-o <target>/bits/stdc++.h.gch/O2ggnu++0x.gch
<gcc-source-path>/libstdc++-v3/include/precompiled/stdc++.h:52:20: fatal error: ccomplex: No such file or directory
#include <ccomplex>
^
compilation terminated.
gcc-object-path -name ccomplex -print를 찾으면 다음이 표시됩니다.
<gcc-object-path>/<target>/libstdc++-v3/include/tr1/ccomplex
<gcc-object-path>/<target>/libstdc++-v3/include/ccomplex
컴파일 명령은 다음과 같습니다
-I<gcc-object-path>/<target>/libstdc++-v3/include
위에.
<gcc-object-path>/<target>/libstdc++-v3/include/ccommon
심볼릭 링크입니다
<gcc-source-path>/libstdc++-v3/include/c_std/ccomplex
그러나 해당 위치의 소스 코드에는 파일이 존재하지 않으므로 심볼릭 링크가 끊어져 컴파일이 실패합니다. 그러나 ccomplex 파일은 소스 트리의 다른 세 위치에 존재합니다. 또한 깨진 심볼릭 링크가 6개 더 있습니다.
이러한 심볼릭 링크를 생성하는 libstdc++-v3/include/Makefile을 살펴보면 소스 트리의 동일한 위치에 있는 모든 c_base_headers 파일을 찾을 것으로 예상하지만 그렇지 않습니다. 이것이 어떻게 작동하나요?
gcc 구성 옵션은 다음과 같습니다.
gcc-${GCC_VERSION}/configure --target=$CONF_TARGET --prefix=${PREFIX} --exec_prefix=${PREFIX} --bindir=${PREFIX}/bin --sbindir=${PREFIX}/bin --libexecdir=${PREFIX}/libexec --datadir=${PREFIX}/share --sysconfdir=${PREFIX}/etc --sharedstatedir=${PREFIX}/share/com --localstatedir=${PREFIX}/var --libdir=${PREFIX}/lib --includedir=${PREFIX}/include --oldincludedir=${PREFIX}/include --infodir=${PREFIX}/share/info --mandir=${PREFIX}/share/man --enable-largefile --disable-nls --enable-ipv6 --with-gnu-ld --enable-shared --enable-languages=c,c++,objc,fortran --enable-threads=posix --disable-multilib --enable-c99 --enable-long-long --enable-symvers-gnu --enable-libstdcxx-pch --program-prefix=${CMD_PREFIX} --enable-target-optspace --enable-cheaders=c_std --disable-bootstrap --disable-libgomp --disable-libmudflap --with-float=soft --with-sysroot=${NEWSYSROOT} --with-build-sysroot=${SYSROOT} --with-build-time-tools=${INSTALLDIR}/${PREFIX}/${CONF_TARGET}/bin --disable-libunwind-exceptions --disable-libssp --enable-__cxa_atexit
답변1
어떤 환경을 사용하고 있나요? 귀하의 대상 환경은 무엇입니까?
ARM에는 다운로드할 수 있는 몇 가지 도구 체인이 있습니다.ARM 개발자 웹사이트.
대상 환경에서 라이브러리와 헤더 파일을 사용할 수 있도록 해야 할 수도 있습니다. FreeBSD의 경우 이는 적절한 base.txz 파일이 되며 올바른 위치에 추출해야 합니다.
386 및 amd64 FreeBSD v 11.*i용 ARM용 기존 GCC 크로스 컴파일러가 있습니다. 또는 구체적으로 arm64/aarch64. 에이다와도 마찬가지다. 이는 /usr/ports/lang/gnatcross*에 있는 포트 중 하나입니다.
Google에서 검색하면 일부 구성 옵션을 사용하여 일반 arm 크로스 컴파일러를 쉽게 컴파일할 수 있습니다. 많은 사람들이 크로스 컴파일러를 컴파일할 때 arm을 예로 사용합니다.
ARM 또는 aarch64 아키텍처 Raspberry PI가 있다면 아마도 좋은 기본 환경을 갖게 될 것입니다. 그렇다면 당신이 해야 할 일은 OS에 의존하지 않는 것뿐입니다.
RPI는 FreeBSD, Raspbian, 기타 Linux 및 BSD 버전을 포함한 다양한 운영 체제에서 사용할 수 있습니다.
저는 aarch64 FreeBSD 12용 GCC를 크로스 컴파일하고 있습니다. 약간의 수정이 필요합니다. 그래서 관련된 포트를 복사하고 수정했습니다. 어려운 점은 gcc를 크로스 컴파일하는 방법을 알아내는 것입니다. 어떤 옵션을 비활성화해야 하는지 알아보세요.