Я пытаюсь скомпилировать GCC 4.8.3
. Я внимательно прочитал документацию, но все еще не могу кросс-компилировать
его для 64-битной
системы. Я также просмотрел это руководство . Но мое требование - собрать GCC
в каталоге / tmp / xxx
. Но флаги - with-sysroot
& - with-native-system-header-dir
мешают компиляции.Согласно документации GCC
, мне нужно использовать флаг - with-sysroot
вместе с - with-native-system-header-dir
.
- with-system-header-dir
принимает имя каталога, в котором установлены файлы заголовков. В моем случае это $ {TOOLS_DIR}
, и это должен быть абсолютный путь. И, - with-sysroot
требует корневого пути к папке, в которой выполняется компиляция. В моем случае это $ {INSTALL_DIR}
.
INSTALL_DIR=/tmp/gcc-compile
TOOLS_DIR=${INSTALL_DIR}/tools
Согласно руководству Linuxfromscratch
, я должен создать папку в корневой системе хоста. Но для этого мне понадобится разрешение sudo
, которого у меня нет. Итак, я решил скомпилировать GCC
в подкаталоге, а не в том, что было упомянуто в книге (потому что все пользователи получают разрешение на чтение / запись для каталога / tmp
).
Теперь GCC
останавливается с ошибкой, что не может найти каталог системного заголовка. И он пытается искать в / tmp / gcc-compile / tmp / gcc-compile / tools / include
, что является неправильным путем .
Я использовал следующие параметры:
sed -i "s#/tools#${TOOLS_DIR}#g" ../gcc-4.8.3-pure64_specs-1.patch
patch -Np1 -i ../gcc-4.8.3-branch_update-1.patch
patch -Np1 -i ../gcc-4.8.3-pure64_specs-1.patch
printf '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "%s/lib/"\n' "${TOOLS_DIR}" >> gcc/config/linux.h
printf '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h
mkdir "${BUILD_DIR}" &&
cd "${BUILD_DIR}" &&
AR=ar LDFLAGS="-Wl,-rpath,${CROSS_DIR}/lib" \
../configure --prefix=${CROSS_DIR} \
--build=${HOST} \
--target=${TARGET} \
--host=${HOST} \
--with-sysroot=${INSTALL_DIR} \
--with-local-prefix=${TOOLS_DIR} \
--with-native-system-header-dir=${TOOLS_DIR}/include \
--disable-nls \
--disable-static \
--enable-languages=c,c++ \
--enable-__cxa_atexit \
--enable-threads=posix \
--disable-multilib \
--with-mpc=${CROSS_DIR} \
--with-mpfr=${CROSS_DIR} \
--with-gmp=${CROSS_DIR} \
--with-cloog=${CROSS_DIR} \
--with-isl=${CROSS_DIR} \
--with-system-zlib \
--enable-checking=release \
--enable-libstdcxx-time
При настройке я написал $ {TOOLS_DIR} / include
, тогда почему GCC
пытается заглянуть в $ {INSTALL_DIR} / $ {TOOLS_DIR} / include
? Может ли кто-нибудь направить меня в правильном направлении?
ВЫХОД
The directory that should contain system headers does not exist:
/tmp/gcc-compile/tmp/gcc-compile/tools/include
make[2]: *** [stmp-fixinc] Error 1
make[2]: *** Waiting for unfinished jobs....
rm gcc.pod
make[2]: Leaving directory `/tmp/gcc-compile/cross-compile-tools/gcc- final/gcc-4.8.3/gcc-build/gcc'
make[1]: *** [all-gcc] Error 2
make[1]: Leaving directory `/tmp/gcc-compile/cross-compile-tools/gcc-final/gcc-4.8.3/gcc-build'
make: *** [all] Error 2
Я исправил это с помощью программной ссылки в sysroot.
if:
--with-systroot=${INSTALL_DIR}
--with-native-system-header-dir=${INSTALL_DIR}/include
then:
pushd ${INSTALL_DIR}
mkdir -p./${INSTALL_DIR}
cd./${INSTALL_DIR}
ln -s../(number of dirs up)/include include
popd