2010-02-14 24 views
5

Phần mềm tôi đang làm việc trên các tàu với NETLIB BLAS/LAPACK được nhúng vào các nguồn của nó bằng cách sử dụng tên ký tự chữ thường, nhưng bây giờ trong khi chuyển ứng dụng sang cửa sổ, tôi phát hiện ra rằng Intel MKL và một số BLAS khác/LAPACK triển khai cho nền tảng này sử dụng tất cả các tên chữ hoa. Có cách nào để nói với trình biên dịch gnu/linker để bỏ qua trường hợp trong khi phù hợp với tên biểu tượng?gcc bỏ qua các tên biểu tượng trong khi liên kết

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

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

Trả lời

2

Sự khác biệt bạn thấy là do quy ước gọi Fortran: trong Fortran, trường hợp biểu tượng không quan trọng và do đó mọi trình biên dịch đều có cách dịch tên biểu tượng Fortran thành tên biểu tượng lắp ráp. Intel trên Windows dùng để viết hoa.

Nếu bạn đang làm việc với mã Fortran, bạn có thể sử dụng tùy chọn -fsymbol-case-upper trên trình biên dịch g77 cũ hơn (trình biên dịch gfortran mới hơn không có điều này). Nếu không, câu trả lời đơn giản cho C, ngoại trừ:

  • sử dụng #define 's
  • sử dụng các giao diện C đến BLAS và LAPACK.
2

Tôi nghĩ bạn có thể gặp khó khăn. Mục 6.4.2.1 của thông số C cho biết "Chữ thường và chữ hoa là khác biệt" đối với số nhận dạng. Điều đó có nghĩa rằng theo như trình biên dịch và trình liên kết của bạn có liên quan, _DGEQP3_dgeqp3 là các ký hiệu khác nhau. Bạn có thể thêm một số câu lệnh #define trong tiêu đề nền tảng cụ thể để xếp hàng cho bạn.

Có phải vì bạn đang liên kết với thư viện cửa sổ thay vì bất kỳ điều gì bạn đang sử dụng trước khi lỗi này xuất hiện?

+0

Soạn gói NETLIB BLAS hoặc LAPACK với mingw gfortran, như chúng tôi đã làm cho đến nay, kết quả là các ký hiệu như ___dgeqp3___ (chữ thường, gạch dưới cuối cùng) nhưng bây giờ tôi muốn sử dụng các trình biên dịch và thư viện khác trên Windows và hầu hết BLAS Triển khai LAPACK được phân phối dưới dạng nhị phân có các tên biểu tượng như _DGEQP3 (chữ hoa, không có dấu gạch dưới cuối cùng) và một số thậm chí có _dgeqp3 (chữ thường, không có dấu gạch dưới cuối cùng). Chúng tôi đã có #define báo cáo để bao gồm dấu gạch dưới cuối cùng và nếu tôi không thể tìm thấy một cách xung quanh vấn đề này trường hợp nhạy cảm, tôi đoán chúng tôi sẽ phải tăng thêm cho phù hợp. –

+0

@Cetin, đôi khi đó là cách mà cookie bị hỏng. Chúc may mắn! –

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"; 

có vẻ là một cách để giới thiệu bí danh biểu tượng tại liên kết thời gian sử dụng --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] ~ 
$ 

Ngoài ra còn phải là một cách để cung cấp cho trình liên kết các tập lệnh khác nhau để xử lý một số lượng lớn các định nghĩa biểu tượng như vậy. Vì vậy, tôi có thể làm cho nó trở thành một phần của quá trình xây dựng để tự động tạo các kịch bản liên kết tạo ra ánh xạ giữa các trường hợp khác nhau.

Các vấn đề liên quan