символы, названные несовместимыми в общих объектах - где искать проблемы - PullRequest
0 голосов
/ 11 февраля 2012

Я новичок в Linux. У меня есть доступ к двум машинам Linux, одному 40-ядерному серверу (A) и кластеру (B). Я пытаюсь сделать то же самое на обеих машинах, это работает на A и не на B. У меня есть права sudo ни на одном. A работает на Debian Squeeze / Sid. B работает на ядре 2.6.18-238.el5. Я не смог найти файл информации о выпуске в / etc. A имеет gcc 4.6.2, а B gcc 4.1.2.

Я скомпилировал и установил локально на обеих машинах данное программное обеспечение для создания сеток Pkg1 и Pkg2, данный решатель. Оба нуждаются в Libtool и automake. Pkg2 - это файл .so. Все отлично работает, я могу запустить примеры. Код был построен с помощью mpicxx. Оба имеют разные MPI-компиляторы. A использует openmpi154, B использует qlogicmpi_gnu-0.1.0.

Теперь я представляю свой код, скажем, Pkg3, несколько файлов .cpp. Я построил .so из этого. Я не использовал Libtool и automake. Был использован простой make-файл с gcc в качестве компилятора и компоновщика (также пробовал mpicxx).

На A, Pkg3 работает нормально. На B вылетает Pkg3. Сбой при попытке динамически привести некоторый тип в Pkg3 к типу, определенному в Pkg2, с сообщением St8bad_cast. Для другого файла данных происходит сбой, когда функция в Pkg2 пытается преобразовать тип из Pkg3 с сообщением 'тип элемента - N5ngfem8FE_Segm2E; ожидаемый тип - N5ngfem19ScalarFiniteElementILi1EEE'

Где мне искать проблемы? Извините за расплывчатость. Все программное обеспечение здесь с открытым исходным кодом, но пакеты слишком велики, чтобы сделать самостоятельное воспроизведение с небольшим объемом работы. Я еще не работал ни с automake и Libtools, ни с mpi, что усугубляет проблему. Я просмотрел make-файлы Pkg1 и Pkg2 и попытался отобразить CXX, LDFLAGS и т. Д. С помощью моего простого make-файла, но множественные косвенные указания, созданные automake / libtools, затрудняют это.

Я понимаю, что символы в Pkg2 искажены в таблице символов по-другому, чем символы в Pkg3. Но об этом должен был позаботиться компоновщик ?! Я пробовал как с, так и без '-Wl, -E' опции для Pkg3. -fPIC всегда там. Правило, связывающее Pkg3, указывает на библиотеку Pkg2 (). Я разместил тело файла сборки Pkg3.

 %.o : %.cpp
     gcc  -O2 -fopenmp -fPIC -DNETGEN_ELTRANS -DUSE_TIMEOFDAY -DLAPACK -I. -I$(NETGENDIR)/../include -c $? -o $@

 libmyngsolve.so : $(objects)
      gcc -shared -Wl,-E -fopenmp -fPIC $(objects) -L/home/lv70227/elan/ng/lib -lngsolve -o $@

 clean:
     rm *.o libmyngsolve.so

Примечание 1:

Команда ./configure для Pkg2 имеет -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group -lpthread то есть, у него нет флага -E. Но именно так это было указано для меня, как ссылка.

Примечание 2:

Путь, определенный в правиле ссылки, -L / home / lv70227 / elan / ng / lib, имеет pkg2.so.0.0.0, две символические ссылки на него и pkg2.la, а не pkg2.sa, так как он был создан libtools.

Любой намек на то, где может быть проблема, приветствуется. Я выполнил одну и ту же процедуру на обеих машинах, сделав минимальные отклонения для размещения разных библиотек mpi, gcc, mkl, установленных в A и B.

Спасибо, Elan.

1 Ответ

0 голосов
/ 13 февраля 2012

Как я уже говорил в комментариях, GCC 4.1 и GCC 4.6 настолько различны, что возможным решением может быть установка GCC 4.6 (возможно, путем компиляции его исходного кода и необходимых зависимостей) на более старой машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...