gcc,

2010-02-14 37 views
5

bağlanırken sembol adlarının muhafazasını yok sayıyor A yazılımında, tüm küçük harfli sembol adlarını kullanarak kaynaklarına gömülü NETLIB BLAS/LAPACK yüklü gemiler üzerinde çalışıyorum ancak şimdi uygulamayı pencerelere taşıyarak Intel MKL ve diğer birkaç BLAS'ı keşfettim Bu platform için/LAPACK uygulamaları, büyük harfli sembol isimlerini kullanır. Sembol adlarını eşleştirirken gnu derleyicisinin/linker'in durumu görmezden gelmesinin bir yolu var mı?gcc,

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

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

cevap

2

Gördüğünüz fark, Fortran çağrı kurallarından kaynaklanıyor: Fortran'da, sembol durumu önemsiz ve bu nedenle her derleyici Fortran sembol adlarını assembler sembol adlarına çevirmek için bir yola sahiptir: GNU derleyicileri genellikle küçük harflere çevirir, Windows'da Intel büyük harf için gider.

Fortran koduyla çalışıyorsanız, daha eski g77 derleyicisindeki -fsymbol-case-upper seçeneğini kullanabilirsiniz (daha yeni gfortran derleyicisinin buna sahip değil). Aksi takdirde, başka C için basit bir cevabı,: BLAS ve LAPACK C arayüzlerini kullanarak #define 'ın

  • kullanılarak

    • . Şimdiye kadar yaptığımız gibi NETLIB BLAS veya mingw gfortran ile LAPACK paketleri, semboller adlarındaki sonuçları ___dgeqp3___ gibi (küçük harf, nihai alt çizgi) ama şimdi Windows ve en BLAS diğer derleyiciler ve kütüphaneleri kullanmak istediğiniz Derleme
  • 2

    Biraz sorun yaşayabileceğinizi düşünüyorum. C spec bölüm 6.4.2.1, "Küçük harf ve büyük harfler, tanımlayıcılara göre farklı" diyor. Bu, derleyici ve linker ile ilgili olarak, _DGEQP3 ve _dgeqp3'un farklı semboller olduğu anlamına gelir. Bazı şeyleri sizin için hizalamak için muhtemelen bir platform özel üstbilgisinde bazı #define ifadeleri ekleyebilirsiniz.

    Bunun nedeni, bu hata ortaya çıkmadan önce kullandığınız şeyden ziyade bir pencere kitaplığına karşı bağlantı kurduğunuz için mi?

    +0

    İkili biçimde dağıtılan LAPACK uygulamalarının _DGEQP3 (büyük harf, son alt çizgi) gibi sembol adları vardır ve bazıları bile _dgeqp3 (küçük harf, son alt çizgi) içermemektedir. Zaten son alt çizgiları kapsayacak şekilde #define ifadelerimiz var ve bu büyük/küçük harf duyarlılığı sorunuyla ilgili bir yol bulamadığımız takdirde, bunları da buna göre arttırmamız gerekecek. –

    +0

    @Cetin, bazen kurabiyenin parçalandığı yol budur. İyi şanslar! –

    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

    --defsym kullanarak bağlantı anda sembol takma adları tanıtmak için bir yol olarak görünüyor
    char* xaxpy = "ln"; 
    char* xaxpy_ = "ls"; 
    char* XAXPY = "UN"; 
    char* XAXPY_ = "US"; 
    

    :

    [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] ~ 
    $ 
    

    da bir yolu olmalı linker, bu sembol tanımlarının çok sayıda ele alınması için farklı betikler vermek. Bu yüzden, farklı durumlar arasında eşlemeler oluşturan linker komut dosyalarının otomatik olarak oluşturulması için yapım sürecinin bir parçasını oluşturabilirim.