Стоит ли переходить на GCC версии 4.2.Х или 4.3.Х ? А то всё стремают мой 4.1.2, мол работает медленно и оптимизирует плохо :( так ли это на самом деле?
По тестам с каждым последующим релизом GCC производительность программ, собранных им увеличивается (не мильно конечно, но факт). Небольшой "провал" был при переходе 3 -> 4, но это пофиксили. Хороший прирост производительности ожидается в 4.4.
Если собрать программу с помощью 4.3.Х, то на целевой системе тоже должна быть установлена версия 4.3.Х. Иначе ваша программа просто не запустится.
Речь о C++, с программами на C проблем нет.
> Если собрать программу с помощью 4.3.Х, то на целевой системе тоже должна быть установлена версия 4.3.Х. Иначе ваша программа просто не запустится. > Речь о C++, с программами на C проблем нет.
> Если собрать программу с помощью 4.3.Х, то на целевой системе тоже должна быть установлена версия 4.3.Х. Иначе ваша программа просто не запустится. > Речь о C++, с программами на C проблем нет.
Только что проверил на одном своём исходнике: бинарник, собранный с GCC 4.3.3 запускается и нормально работает на системе, на которой стоит только GCC 4.1.2. А вот при переходе от GCC 3 к GCC 4 у libstdc++ ABI действительно поломали.
> Слыхал, что некоторые программы не хотят собираться с GCC 4.3.X, сталкивались ли вы с этим?
Известные мне эпичные случаи (virtualbox только с 4.2 собирался, а qemu только с 3) пофикшены. А по мелочам обычно в дистрибутивах мэйнтейнерами патчики накладываются.
> И ещё: необходимо ли сначала пересобрать system а уже потом world? Неужели нельзя сразу world, чтоб 2 раза одно и тоже не компилить?
Можно вообще ничего не пересобирать, а можно пересобирать в любом порядке. В пределах мажорной версии (4) ABI не ломают, так что никаких несовместимостей появиться не должно*.
> Только что проверил на одном своём исходнике: бинарник, собранный с GCC 4.3.3 запускается и нормально работает на системе, на которой стоит только GCC 4.1.2. А вот при переходе от GCC 3 к GCC 4 у libstdc++ ABI действительно поломали.
Одной из причин отката на 4.1.2 была именно несовместимость. До этого стоял gcc-4.3.2 - софт не работал на системах с 4.1.2. В системе до сих пор остался софт, который не работает. Потихоньку пересобираю то, что необходимо в данный момент.
Вот пример утилиты, собранной с 4.3.2:
$ ./test
./test: /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./test)
>И ещё: необходимо ли сначала пересобрать system а уже потом world? Неужели нельзя сразу world, чтоб 2 раза одно и тоже не компилить?
Можно воспользоваться чем-то навроде:
#!/bin/bash
PCKGS=""
for i in $(find /var/db/pkg -maxdepth 2 -mindepth 2 |grep -vP 'gentoo-sources'|grep -v '\.cache'|grep -v MERGING|sed 's!/var/db/pkg/!!'); do
if [[ $(php -r "echo filemtime('/var/db/pkg/$i');") < 1234567890 ]]; then
PCKGS="${PCKGS} =${i}"
fi
done
emerge -av1 --keep-going ${PCKGS}
где 1234567890 - это unixtime. Пакеты, старше этого времени, требуется пересобрать.
Исправляет в бинарниках ссылки на либы удалённых старых версий GCC. _Обязательны_ к запуску при удалении любой версии GCC, если ей хоть что-то компилилось.
Собственно:
# qfile fix_libtool_files.sh
sys-devel/gcc (/usr/share/gcc-data/i686-pc-linux-gnu/4.3.3/fix_libtool_files.sh)
# fix_libtool_files.sh
Usage: fix_libtool_files.sh <old-gcc-version> [--oldarch <old-CHOST>]
Where <old-gcc-version> is the version number of the
previous gcc version. For example, if you updated to
gcc-3.2.1, and you had gcc-3.2 installed, run:
# fix_libtool_files.sh 3.2
If you updated to gcc-3.2.3, and the old CHOST was i586-pc-linux-gnu
but you now have CHOST as i686-pc-linux-gnu, run:
# fix_libtool_files.sh 3.2 --oldarch i586-pc-linux-gnu
Note that if only the CHOST and not the version changed, you can run
it with the current version and the '--oldarch <old-CHOST>' arguments,
and it will do the expected:
# fix_libtool_files.sh `gcc -dumpversion` --oldarch i586-pc-linux-gnu
> Исправляет в бинарниках ссылки на либы удалённых старых версий GCC. _Обязательны_ к запуску при удалении любой версии GCC, если ей хоть что-то компилилось.
Спасибо, не знал об этом. Похоже идет с пакетом sys-devel/libtool.
# equery b fix_libtool_files.sh
[ Searching for file(s) fix_libtool_files.sh in *... ]
sys-devel/gcc-4.1.2 (/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/fix_libtool_files.sh)
А как правильно пересобирать систему потом? Некоторые советуют пересобрать 2 раза system, потом world, другие говорят что однократной пересборки system достаточно. Как правильно?