суббота, 29 мая 2010 г.

Пример использования GNU Scientific Library (GSL) в Дебиан

Этот исходник взят с GSL-CBLAS-Examples
#cat gsl-cblas.c
Описание функций из библиотеки GSL находиться здесь.

#include <stdio.h>
#include <gsl/gsl_cblas.h>
int
main (void)
{
int lda = 3;
float A[] = { 0.11, 0.12, 0.13,
0.21, 0.22, 0.23 };
int ldb = 2;
float B[] = { 1011, 1012,
1021, 1022,
1031, 1032 };
int ldc = 2;
float C[] = { 0.00, 0.00,
0.00, 0.00 };
/* Compute C = A B */
cblas_sgemm (CblasRowMajor,
CblasNoTrans, CblasNoTrans, 2, 2, 3,
1.0, A, lda, B, ldb, 0.0, C, ldc);
printf ("[ %g, %g\n", C[0], C[1]);
printf (" %g, %g ]\n", C[2], C[3]);
return 0;
}

Процедура просто перемножает две матрицы. Ее описание тут.
Чтобы откомпиллировать этот исходник командой
#gcc -o gsl-cblas gsl-cblas.c -lblas
нам необходимы файлы libblas.so и libblas.so.
#apt-file search /usr/lib/libblas.so
refblas3: usr/lib/libblas.so.3
refblas3: usr/lib/libblas.so.3.0
refblas3-dev: usr/lib/libblas.so

# ls -al /usr/lib/libblas.so
lrwxrwxrwx 1 user user 12 2009-08-06 14:44 /usr/lib/libblas.so -> libblas.so.3
# apt-file search /usr/include/gsl/gsl_cblas.h
libgsl0-dev: usr/include/gsl/gsl_cblas.h
libgsl0-dev: usr/include/gsl/gsl_cblas.h

Вывод команды ./gsl-cblas:
[ 367.76, 368.12
674.06, 674.72 ]
Этот исходник можно откомпиллировать также с помощью команды:
#gcc -Wall gsl-cblas.c -lgslcblas
Для успешной компилляции нужен установленный пакет libgsl0:
#ls -al /usr/lib/libgslcblas.so
lrwxrwxrwx 1 user user 20 2009-12-17 16:45 /usr/lib/libgslcblas.so -> libgslcblas.so.0.0.0
#ls -al /usr/lib/libgslcblas.so.0.0.0
-rw-r--r-- 1 user user 188936 2006-11-19 03:26 /usr/lib/libgslcblas.so.0.0.0
#apt-file search /usr/lib/libgslcblas.so.0.0.0
libgsl0: usr/lib/libgslcblas.so.0.0.0

Как найти пакеты, от которых зависит во время сборки данный бинарный файл в Дебиан

Делаем
$ objdump -p /usr/bin/myProgramm | grep NEEDED
Это вывод файлов, от которые нужны при постройке myProgramm. Пусть это будет такой вывод:
NEEDED libblas.so.3
NEEDED libc.so.6

Далее каждого такого файла делаем команду dpkg -S:
$ dpkg -S /usr/lib/libblas.so.3
Вывод будет такой:
refblas3: /usr/lib/libblas.so.3
Более развернутый вывод будет у команды
$ apt-file search /usr/lib/libblas.so.3
refblas3: usr/lib/libblas.so.3
refblas3: usr/lib/libblas.so.3.0

То есть при построении программы myProgramm понадобиться библиотека libblas.so.3 из пакета refblas3