Pacote de desenvolvimento CLAPACK

Iniciado por Thiago Henrique, 15 de Dezembro de 2008, 20:50

tópico anterior - próximo tópico

Thiago Henrique

 Olá estou querendo instalar o pacote CLAPACK voltado para álgebra linear e que é uma tradução de antigas rotinas em Fortran para C.
Segui todas as rotinas de instalação descritas no site dos desenvolvedores:

http://www.netlib.org/clapack/readme.install

E com tudo instalado e os testes feitos, não consigo de forma alguma testar um simples programa que exemplifica o uso de uma das funções do pacote =X :

http://www.netlib.org/clapack/faq.html#1.9

Após compilar assim: gcc teste.c -o teste

Recebo o erro:

/tmp/ccczFf2K.o: In function `main':
teste.c:(.text+0x14a): undefined reference to `dgesvd_'
collect2: ld returned 1 exit status

->"dgesvd_" está definida no header "clapack.h" mas o compilador não a reconhece!

Antes de começar a configurar variáveis de ambiente ou criar makefiles eu simplesmente quiz ver o programa funcionando e coloquei esse source "teste.c" no mesmo diretorio que os headers, ou seja, NÂO SEI MESMO O Q ESTÀ ACONTECENDO O.O

Enfim, gostaria de saber se estou comentendo algum erro, e se alguém já mexeu com o pacote talvez possa me ajudar também...

Grato desde já, Thiago.

Darcamo

O erro não foi de compilação, mas sim de linkagem.
Você precisa dizer para o linkador para linkar com a biblioteca do clapack.

Se o erro fosse de compilação a mensagem de erro seria diferente. Aqui não tenho essa biblioteca instalada e olha o erro que recebo ao tentar compilar o exemplo.
'dgesvd_' was not declared in this scope

Você tem que acrescentar "-L minúsculo nome da biblioteca" ao comando na hora de compilar para indicar que o linkador deve linkar com a biblioteca clapack.
Tenta compilar o programa com o comando
gcc teste.c -o teste -lclapack

Thiago Henrique

 Sem resultados =/

Existem outros headers no diretório: f2c.h e blaswrap.h
Tentei colocar como opção eles também:  -lf2c -lblaswrap
É necessário for a extensão "*.h" ou sem ela como vc fez ?

Grato, Thiago.



Darcamo

Você não precisa acrescentar opção para arquivos .h que você fez. Apenas para biblioteca que você usa.
Se você está compilando um exemplo com vários arquivos, tem que linkar com os "arquivos .o" compilados de cada um deles. A maneira mais fácil é simplesmente compilar todos de uma vez.

Por exemplo, digamos que eu tenha os arquivos main.cpp, classe1.h classe1.cpp, classe2.h e classe2.cpp.
Digamos que o main.cpp usa funções ou classes nos demais arquivos. A melhor maneira então é compilar com o comando
gcc -o arquivo_compilado main.cpp, classe1.h classe1.cpp, classe2.h e classe2.cpp
Ou simplesmente
gcc -o arquivo_compilado *.h *.cpp

Se, por exemplo, o arquivo classe1.cpp usa uma função na biblioteca gtkmm, então eu teria que compilar indicando para o linkador para também linkar com a gtkmm
gcc -o arquivo_compilado main.cpp, classe1.h classe1.cpp, classe2.h e classe2.cpp

Thiago Henrique

Compilando assim:

gcc teste.c lapack_LINUX.a blas_LINUX.a F2CLIBS/libf2c.a -lm -IINCLUDE

deu certo, o que significa o parametro "-lm" ?

Grato, Thiago.

Darcamo

O -lm indica que deve linkar com a biblioteca matemática.
Se não me engano é nela que ficam funções como pow, sqrt,cos, etc..

Como é chato ter que usar esse comando para compilar (que só tende a crescer a medida que o número de arquivos aumenta) o ideal é criar um makefile.
Aqui tem um tutorial sobre como fazer isso
http://ubuntuforum-br.org/index.php/topic,21155.0.html

Thiago Henrique

 Ok muito obrigado pela ajuda, já estou usando os makefiles.