Ключевые слова:kylix, lib, linux, compile, (найти похожие документы)
From: Сердцев А.А. <stolia@mail.ru.>
Newsgroups: http://www.linuxrsp.ru/
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Устранение проблем компиляции в Borland Kylix 3 при glibc 2.3.2
Оригинал: http://www.linuxrsp.ru/artic/compile-in-kylix3-on-asplinux9/index.html
Устранение проблем компиляции в Borland Kylix 3 при glibc 2.3.2
Аннотация:
В статье описывается как устранить проблемы компиляции в среде Borland
Kylix 3 при glibc 2.3.2.
Проблема
Ошибки, возникающие при компиляции проектов в Kylix 3, связаны с тем,
что он настроен на работу с библиотекой glibc версии 2.1.2. А сейчас,
на дистрибутивах устанавливаются новые версии этой библиотеки, которые
уже не имеют обратной совместимости со своими старыми версиями (по
крайней мере могу утверждать про glibc 2.3.2). Главным различием между
2.1.2 и 2.3.2 является способ запуска программ, вернее передачи
управления функции main (для этого при сборке программы прицепляется
объектный файл crt1.o). В 2.3.2 для передачи управления используются
так называемые функции init/fini, которые задаются линковщиком! А вот
о них то, как раз, и не знает борландовский <<связник>>.
Предлагается два пути решения:
1. Настроить Kylix под пакет compat-glibc-6.2-2.1.3.2, под который
Kylix и создавалась.
2. Пропатчить Kylix для работы с glibc 2.3.
Оба способа выдуманы не мной, поэтому отправляю к оригиналам:
первый -- http://www.linuxquestions.org/questions/archive/9/2003/08/3/42518
второй -- http://www.kylix-patch.de.vu/
Советую применять второй способ для устранения проблемы, т.к. он не
только подстраивает Kylix под glibc 2.3, что даёт больше возможностей
программисту, но и исправляет некоторые баги.
Неважно какой вы способ выбрали, сперва нужно перебраться на ядро
2.4.21 или выше (как с ядрами из ветки 2.6 я не в курсе). Если этого
не сделать происходит зависание Kylix при вызовах диалогов open/save
(если это произошло, то нужно правильно убивать, иначе комп повиснет;
убиение происходит по схеме -- от потомков к родителям). А при
закрытии Kylix компьютер точно повиснет (и не важно каков ваш статус в
системе и приоритетность выполнения задачи).
Решение. Способ N1
Итак, первый вариант:
1. Установка compat-glibc 2.1. Именно эту версию и будем использовать
для компиляции проектов Kylix. Подойдет пакет
compat-glibc-6.2-2.1.3.2.rpm из Redhat 7.2, или, откуда я взял,
compat-glibc-6.2-2.1.3.2.0.asp.i386.rpm из ASPLinux 7.2. Файлы
пакета, после установки, должны быть в директории
/usr/i386-glibc21-linux, так что они ни как не повлияют на работу
gcc и на загрузку so-файлов.
2. Установка Kylix 3:
[root]$ sh setup.sh -m
Далее идёт регистрация лицензии, если, конечно, она есть в
наличии. Нет -- найди.
3. Запусти Kylix и закрой все проекты (File->Close All). Это нужно
для того, чтобы настроить опции по умолчанию.
Затем, открой окно настройки опций (Project->Options), вкладку
Directories/Conditionals и замени в Include path /usr/include на
/usr/i386-glibc21-linux/include и в Library path /usr/lib на
/usr/i386-glibc21-linux/lib
4. Для того что бы заголовочные файлы Kylix ссылались на
/usr/i386-glibc21-linux/include, а не на /usr/include нужно в
директории K3_HOME/include подправить файлы _defs.h and defs.h
следующим образом: заменить строки
#define _STD_HEADER_(__a) </usr/include>
на
#define _STD_HEADER_(__a) </usr/i386-glibc21-linux/include>
5. Проделанных шагов уже хватит, что бы собрать проект, но на
некоторых системах при запуске скомпилированного приложения из IDE
Kylix происходит зависание оболочки (как правило, эта проблема
исчезает, когда переползаешь на новое ядро). Для решения этой
проблемы при запуске Kylix нужно задать перременную
LD_ASSUME_KERNEL=2.2.5:
[user]$ export LD_ASSUME_KERNEL=2.2.5; startbcb
Вот и всё, что касается первого способа.
Решение. Способ N2
Второй способ очень прост. Просто, нужно зайти на
http://www.kylix-patch.de.vu/ и скачать патчи. Там их несколько и
все их желательно применить. Далее следуйте по инструкции установки,
ничего сложного и ставятся они без проблем.
Главный патч, который нам нужен, обозван как k3fix.tar.gz. Но, при
установке, он меняет карту символов. Для устранения этого неудобства
просто удалите в домашней директории файл .Xmodmap:
[user]$ rm ~/.Xmodmap
Вот и всё, должно работать и прописывать переменною
LD_ASSUME_KERNEL=2.2.5 не требуется. Пользуйтесь.
Решение. Резервный вариант
Есть еще и третий способ, который проделал я, путём проб и ошибок. Это
я уже потом обнаружил второй способ, так что можно сказать, что сейчас
он не актуален.
Мой способ является чем-то средним между первым и вторым --
используется библиотека glibc 2.3.2, но её нужно собирать, и,
соответственно, установленная на системе glibc не используется. И для
этого способа нужно собрать ядро выше 2.4.20. Немного опишу его, на
тот случай, если патч не подойдёт для установленной glibc, например
выйдет более новая версия glibc.
Лень писать всё (да кому это собственно надо), поэтому, повествую на
идейном уровне. Главное это собрать glibc. Но прежде чем её компилять
нужно немного подправить исходники: в configure добавить строку
libc_cv_initfinit_array=no (строка 4830, проверка поддержки
.preinit_array/.init_array/.fini_array), тем самым отказываемся от
использования функций init/fini в компилируемой glibc, что,
собственно, и не устраивало борландовский линковщик. Но у меня
возникли дополнительные проблемы с этим же линковщиком -- он
отказывался находить функцию _nl_archive_subfreeres, хотя она и была
определена в готовом файле libc.a (чужая душа -- потёмки). Для решения
этой проблемы я перенёс функцию _nl_archive_subfreeres из файла
loacale/loadarchive.c в файл locale/setlocale.c (в
loacale/loadarchive.c эту функцию закоментарил). Тогда всё удалось.
Далее идет сборка. Собирать glibc нужно как обычно, но директорию
установки нужно указать иную, чем по умолчанию (опция --prefix,
например, --prefix=/usr/local/glibc-2.3.2-for-kylix3) -- зачем нужны
лишние проблемы. Затем идут шаги идентичные в способе N1 при настройки
Kylix под нужную glibc (см. выше). Всё должно заработать.
Предложенный способ является тернистым, но то же имеет право на
существование: Х_йня война -- главное манёвры.
.PS
Описанные мною действия восстановлены по памяти. Поэтому, может быть я
что-то и упустил, но это возможно только в плане мелочей.
Надеюсь эта статья вам помогла. Удачи!
Сердцев А.А. <stolia@mail.ru.>
Об этом документе ...
Устранение проблем компиляции в Borland Kylix 3 при glibc 2.3.2
The translation was initiated by Anatoly A. Serdtcev on 2004-03-19