2014-06-26 3 views
1

Я пытался часами, и это сводит меня с ума. Последняя ошибка, я получаю:Не удалось связать код c для lapack/blas: undefined reference

demo_cblas.c:(.text+0x83): undefined reference to `clapack_sgetrf' 
demo_cblas.c:(.text+0xa3): undefined reference to `clapack_sgetri' 

Я компиляции кода с помощью

/usr/bin/gcc -o demo_cblas demo_cblas.c -L /usr/lib64 -l :libgfortran.so.3 -L /usr/lib64 \ 
    -llapack -L /usr/lib64 -lblas 

я попробовать и без libgfortran, с различными компиляторов GCC-33, GCC-47, НКУ-48. Тест-код не от меня, а от этого форума ...

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 
#include "clapack.h" 
#include "cblas.h" 

void invertMatrix(float *a, unsigned int height){ 
int info, ipiv[height]; 
info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv); 
info = clapack_sgetri(CblasColMajor, height, a, height, ipiv); 
} 

void displayMatrix(float *a, unsigned int height, unsigned int width) 
{ 
int i, j; 
for(i = 0; i < height; i++){ 
for(j = 0; j < width; j++) 
{ 
       printf("%1.3f ", a[height*j + i]); 
     } 
     printf("\n"); 
} 
printf("\n"); 
} 


int main(int argc, char *argv[]) 
{ 
int i; 
float a[9], b[9], c[9]; 
srand(time(NULL)); 
for(i = 0; i < 9; i++) 
{ 
     a[i] = 1.0f*rand()/RAND_MAX; 
     b[i] = a[i]; 
} 
displayMatrix(a, 3, 3); 
return 0; 
} 

Я нахожусь на Suse 12.3 64 бит. В/usr/lib64 у меня есть liblapack.a liblapack.so, ... и libblas.a libblas.so, ... и libgfortran.so.3

Тот же код без функции «invertMatrix» (один используя библиотеку) компилируется отлично.

Любая идея или предложение?

Благодарим всех вас за помощь.

Вава

+0

Что такое ': libgfortran.so.3'? Почему бы не просто «gfortran»? –

+0

в/usr/lib64 - это только libgfortran.so.3 и не libgfortran.a или libgfortran.so. Я не понимаю, почему это так? Я также прочитал, что для этого пакета требуется этот lib, но в этом конкретном случае он ничего не меняет. – user3778776

+0

Похоже, что у вас отсутствует какой-то пакет «dev» для libgfortran - обычно это то, что установит символическую ссылку из /usr/lib64/libgfortran.so -> libgfortran.so.3. Файл «3» обычно поступает из пакета «runtime», и если у вас нет символической ссылки, вы где-то пропускаете «dev». –

ответ

2

Я вполне уверен, что вы также должны связать с libcblas, который является с оболочкой библиотека для libblas. Обратите внимание, что libblas является библиотекой FORTRAN, поэтому она не содержит функцию clapack_ *, которую вы вызываете.

+0

Я пробую с libclas, но безрезультатно. Что касается clapack_ *, то он определяется в заголовке clapack.h. В этом сообщении http://stackoverflow.com/questions/6567849/lapacke-or-clapack-if-programming-in-cc-in-linux – user3778776

+0

сказано, что clapack можно скомпилировать с помощью компилятора ac с использованием некоторого «конвертера f2c» (которые я установил кстати). Я понимаю, что мне не нужно заботиться об этом «обращении». Я запутался ... – user3778776

+0

Если вы работаете с окнами, вы можете попробовать следующее: http://hep.ph.liv.ac.uk/~hock/My_reports/CLAPACK/CLAPACK%20INSTALLING,%20USING. htm. В Linux гораздо проще использовать cblas, который поставляется с научной библиотекой GNU (GSL). Еще проще, вы можете напрямую вызвать функцию fortran, не проходя через оболочку clapack, поскольку у вас уже установлены liblapack и libblas. – downhillFromHere

0

Я только что получил эту работу на FreeBSD с:

gcc -o test test.c \ 
-llapack -lblas -lalapack -lcblas 

бы я установил математический/атлас (из портов) и LaPack и Бласа пакетов.

Смотрите мой вопрос here

Смежные вопросы