[Comm] ЦЕРНовская графика ROOT, Desktop 4.0 и экскурсия в Ubuntu 7.10

=?iso-8859-1?q?panov_=CE=C1_dec1=2Esinp=2Emsu=2Eru?= =?iso-8859-1?q?panov_=CE=C1_dec1=2Esinp=2Emsu=2Eru?=
Вт Мар 25 22:30:18 MSK 2008


Здравствуйте всем!

Я много лет пользовался Альтлинуксом вместе с пакетом
научной ЦЕРНовской графики ROOT (http://root.cern.ch), но начиная с
Desktop 4.0 пакет ROOT перестал компилиться. Я сначала думал, что дело
в версии компилятора (т.е. gcc-4.1), так как официально ROOT
поддерживает только до gcc-3.4. Но потом в сети нашел
откомпилированную gcc-4.1 версию
(ftp://root.cern.ch/root/root_v5.12.00.linux-gcc-4.1.tar.gz). Дальше я
установил у себя линукс Ubuntu-7.10, где тоже основной компилятор
gcc-4.1, и проверил сам - ROOT компилится с gcc-4.1 без проблем!
Значит, проблема в реализации компилятора Альтлинукса.

Я уж подумал было, буду работать в Ubuntu. Но там оказалась очень
кривая русификация; emacs, без которого жить не могу, тоже совсем
кривой. Надо разбираться с Альтлинуксом, иначе жизни нет.

Вот что происходит при компиляции ROOT'a в Desktop 4.0 (это для
версии ROOT 5.18). Первая ошибка такая:

cint/src/g__cfunc.c:50: ошибка: expected declaration specifiers or '...' 
before numeric constant
cint/src/g__cfunc.c:50: ошибка: expected ')' before '!=' token
cint/src/g__cfunc.c:50: ошибка: expected ')' before '?' token

Соответствющий фрагмент кода из файла g__cfunc.c такой:

48  #if defined(G__ANSI) || defined(G__ANSIHEADER)
49  int memcmp(const void *region1,const void *region2,size_t count);
50  void* memcpy(void *region1,const void *region2,size_t n);
51  #elif defined(_AIX)

Здесь все ясно. В gcc-4.1 Альтлинукса определен лишний макрос
'memcpy', который пытается раскрыться где не надо. Вставляю перед
этим фрагментом строчку:

#undef memcpy // ERROR CORRECTION

и компиляция продолжается дальше. До следующего сообщения об ошибке:

g++ -m32 -O2  -o bin/cint cint/main/cppmain.o \
                    -Llib -lCint -lm -ldl -rdynamic
lib/libCint.so: undefined reference to `dlsym'
lib/libCint.so: undefined reference to `dlerror'
lib/libCint.so: undefined reference to `dlopen'
lib/libCint.so: undefined reference to `dlclose'
collect2: выполнение ld завершилось с кодом возврата 1

Это уже хуже. Не извелекаются функции из библиотеки libltdl, хотя
сама библиотека присутствует в /usr/lib (файлы libltdl.a,
libltdl.so, libltdl.so.3, libltdl.so.3.1.4)

Дело точно не в том, что библиотека не находится. Я прогнал такой
тестовый пример с командной строкой
g++ -m32 -O2  -rdynamic -lltdl Test.c:

// Test.c
#include <dlfcn.h>
int main()
{
   dlopen("Test", 0);  dlerror();
   return 0;
}

и получил сообщения об ошибках:

In function `main':
Test.c:(.text+0x25): undefined reference to `dlopen'
Test.c:(.text+0x2a): undefined reference to `dlerror'

Т.е. функции библиотеки не грузятся, хотя библиотека есть. Почему?

Я бы снова установил Altlinux Compact 3.0, где все отлично компилится,
но не устанвливается он на мой ноутбук! Что делать?

Заранее благодарен,
Александр.


Подробная информация о списке рассылки community