Я новичок в 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.