[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