2010-02-14 10 views
5

Oprogramowanie pracuję na statkach z NETLIB BLAS/LAPACK osadzonych w swoich źródłach przy użyciu nazw pisanych małymi literami, ale teraz podczas przenoszenia aplikacji do okien odkryłem, że Intel MKL i kilka innych BLAS/W implementacjach LAPACK dla tej platformy używane są wielkie litery. Czy istnieje sposób, aby powiedzieć kompilatorowi/łącznikowi gnu, aby ignorował wielkość liter podczas dopasowywania nazw symboli?gcc ignoruj ​​obudowę nazw symboli podczas łączenia

. 
. 
. 
undefined reference to `_dgeqp3' 
. 
. 
. 

$ nm /lib/LAPACK.lib | grep -i " T _dgeqp3" 
00000000 T _DGEQP3 

Odpowiedz

2

Różnica, jaką widzisz, wynika z konwencji wywołania Fortran: w Fortranie wielkość symbolu nie jest ważna, a zatem każdy kompilator ma sposób na przetłumaczenie nazw symboli Fortran na nazwy symboli asemblera: kompilatory GNU zwykle tłumaczą wszystko na małe, System Intel w systemie Windows obsługuje wielkie litery.

Jeśli pracujesz z kodem Fortran, możesz użyć opcji -fsymbol-case-upper na starszym kompilatorze g77 (nowszy kompilator gfortran tego nie ma). W przeciwnym razie, nie ma prostej odpowiedzi na C, z wyjątkiem:

  • użyciu #define „s
  • przy użyciu interfejsów C Blas i LAPACK.
2

Myślę, że możesz mieć kłopoty. Punkt 6.4.2.1 specyfikacji C mówi: "Małe i wielkie litery są różne" w odniesieniu do identyfikatorów. Oznacza to, że jeśli chodzi o twój kompilator i linker, _DGEQP3 i _dgeqp3 są różnymi symbolami. Możesz prawdopodobnie dodać niektóre instrukcje #define w nagłówku specyficznym dla platformy, aby dostosować je do swoich potrzeb.

Czy to dlatego, że łączysz się z biblioteką Windows, a nie z tym, czego używałeś wcześniej, zanim pojawił się ten błąd?

+0

Kompilacja netlib Blas lub pakiety Lapack z mingw gfortran, co robiliśmy do tej pory, wyniki w symbolach nazw jak ___dgeqp3___ (małe, końcowe podkreślenie), ale teraz chcę używać innych kompilatorów i bibliotek na Windows i większości BLAS Implementacje LAPACK rozproszone w postaci binarnej mają nazwy symboli, takie jak _DGEQP3 (wielkie litery, bez końcowego podkreślenia), a niektóre nawet _dgeqp3 (małe litery, bez końcowego podkreślenia). Mamy już #define wyciągi do podkreślenia ostatecznych podkreśleń i jeśli nie mogę znaleźć sposobu na obejście tego problemu z rozróżnianiem wielkości liter, myślę, że będziemy musieli odpowiednio je poprawić. –

+0

@Cetin, czasami to sposób w jaki ciasteczko się kruszy. Powodzenia! –

1

tc

#define __CONCAT(x,y) x##y 

#ifdef SUFFIX 
#define __SUFFIX(x) __CONCAT(x,_) 
#else 
#define __SUFFIX(x) x 
#endif 

#ifdef UPPER 
#define __c(U,l) __SUFFIX(U) 
#else 
#define __c(U,l) __SUFFIX(l) 
#endif 

#define xaxpy __c(XAXPY, xaxpy) 

#include <stdio.h> 

char* xaxpy; 
char* DAXPY; 

int main() 
{ 
    printf(xaxpy); 
    printf(DAXPY); 
} 

ec

char* xaxpy = "ln"; 
char* xaxpy_ = "ls"; 
char* XAXPY = "UN"; 
char* XAXPY_ = "US"; 

wydaje się być sposobem na wprowadzenie aliasów symbolu na łącza czasie korzystania --defsym:

[email protected] ~ 
$ gcc -D UPPER -D SUFFIX -c t.c e.c 

[email protected] ~ 
$ gcc -o t t.o e.o -Wl,--defsym=_DAXPY=_xaxpy 

[email protected] ~ 
$ ./t 
USln 
[email protected] ~ 
$ 

Musi być również sposobem dać linkerowi różne skrypty do obsługi dużej liczby takich definicji symboli. Mogę więc uczynić go częścią procesu kompilacji, aby automatycznie tworzyć skrypty linkerów, które tworzą odwzorowania między różnymi przypadkami.

Powiązane problemy