Компиляция теста PARDISO для линейного решателя с GCC - PullRequest
1 голос
/ 07 августа 2009

Я пытаюсь скомпилировать линейный системный решатель, используя PARDISO . Контрольный пример (pardiso_sym.c) также загружен с того же веб-сайта выше.

У меня в каталоге есть следующие файлы:

[gv@emerald my-pardiso]$ ls -lh
total 1.3M
-rw-r--r-- 1 gv hgc0746 1.3M Aug  7 11:59 libpardiso_GNU_IA64.so
-rw-r--r-- 1 gv hgc0746 7.2K Nov 13  2007 pardiso_sym.c

Затем я пытаюсь скомпилировать его с помощью следующей команды:

[gv@emerald my-pardiso]$ gcc pardiso_sym.c -o pardiso_sym -L . -llibpardiso_GNU_IA64.so -L/home/gv/.boost/include/boost-1_38 -llapack

Но выдает эту ошибку:

/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.3.2/../../../../x86_64-unknown-linux-gnu/bin/ld:
cannot find -llibpardiso_GNU_IA64.so
collect2: ld returned 1 exit status

Что не так с моим методом компиляции?

Это дополнительная информация о моей системе:

[gv@emerald my-pardiso]$ uname -a
Linux gw05 2.6.18-92.1.13.el5 #1 SMP Wed Sep 24 19:32:05 EDT 2008
x86_64 x86_64 x86_64 GNU/Linux

[gv@emerald my-pardiso]$ gcc --version
gcc (GCC) 4.3.2

Обновление

Библиотека распознается по предложению Дейва Гэмбла. Но теперь это дает другое Ошибка:

$ gcc pardiso_sym.c -o pardiso_sym -L . -lpardiso_GNU_IA64 -L/home/gv/.boost/include/boost-1_38 -llapack
./libpardiso_GNU_IA64.so: undefined reference to `s_stop'
./libpardiso_GNU_IA64.so: undefined reference to `s_wsfe'
./libpardiso_GNU_IA64.so: undefined reference to `e_wsfe'
./libpardiso_GNU_IA64.so: undefined reference to `z_abs'
./libpardiso_GNU_IA64.so: undefined reference to `s_cat'
./libpardiso_GNU_IA64.so: undefined reference to `s_copy'
./libpardiso_GNU_IA64.so: undefined reference to `do_fio'

Ответы [ 2 ]

2 голосов
/ 07 августа 2009

EDIT: Для новых ошибок вам понадобится -lg2c после -lapack (библиотека совместимости с fortran)

EDIT2: Также добавьте -lgfortran и все остальное, что вам может понадобиться. Поиск в поисках недостающего символа обычно находит упоминания о библиотеке, которая в нем содержится. Продолжайте добавлять библиотеки одну за другой, пока все зависимости не будут удовлетворены.

Так что в вашем случае рутина выглядит так:

связанный лапак - получил неразрешенный символ от g2c

добавлено g2c - получил символы от gfortran

добавлен gfortran - получите другие символы, найдите их и добавьте libs один за другим.

Порядок Libray имеет значение, если вы включите g2c перед лапаком, например, компоновщик выбросит все свои символы, прежде чем он узнает, что они необходимы для лапака (компоновщик MS делает 2 прохода, чтобы это исправить). Поэтому, если вы видите отсутствующий символ в уже включенной в него библиотеке, посмотрите, какая библиотека нуждается в ней, и переместите библиотеку с символом после нее.

2 голосов
/ 07 августа 2009

РЕДАКТИРОВАТЬ: я прочитал руководство по пардизо. Вот исправление:

gcc pardiso_sym.c -o pardiso_sym -L . -lpardiso_GNU_IA64 -L/home/gv/.boost/include/boost-1_38 -llapack

Здесь я удалил "lib" с начала и ".so" с конца -lpardiso_GNU_IA64

...