gcc игнорируют преобразование регистра имен символа при соединении

Программное обеспечение я работаю над поставками с NETLIB BLAS/LAPACK, встроенным в его источники с помощью имен все-символа нижнего регистра, но теперь при портировании приложения на окна я обнаружил, что Intel MKL и несколько других реализаций BLAS/LAPACK для этой платформы используют имена все-символа верхнего регистра. Существует ли способ сказать компилятору/компоновщику гну игнорировать регистр при соответствии именам символа?

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

$ nm /lib/LAPACK.lib | grep -i " T _dgeqp3"
00000000 T _DGEQP3
5
задан Cetin Sert 15 February 2010 в 02:12
поделиться

3 ответа

Разница, которую вы видите, связана с соглашениями о вызовах Fortran: в Fortran регистр символов не важен, и, таким образом, каждый компилятор имеет способ переводить имена символов Fortran в имена символов ассемблера: компиляторы GNU обычно переводят все в нижний регистр, Intel в Windows - заглавные буквы.

Если вы работаете с кодом Fortran, вы можете использовать параметр -fsymbol-case-upper в более старом компиляторе g77 (более новый gfortran в компиляторе этого нет). В противном случае для C нет простого ответа, кроме:

  • с использованием #define
  • с использованием интерфейсов C для BLAS и LAPACK.
2
ответ дан 14 December 2019 в 19:12
поделиться

t.c

#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);
}

e.c

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

Кажется, есть способ ввести псевдонимы символов во время компоновки с помощью --defsym:

Cetin@BAKA-CHAN ~
$ gcc -D UPPER -D SUFFIX -c t.c e.c

Cetin@BAKA-CHAN ~
$ gcc -o t t.o e.o -Wl,--defsym=_DAXPY=_xaxpy

Cetin@BAKA-CHAN ~
$ ./t
USln
Cetin@BAKA-CHAN ~
$

Также должен быть способ дать компоновщику различные сценарии для обработки большого количества таких определений символов. Поэтому я мог бы сделать частью процесса сборки автоматическое создание сценариев компоновщика, создающих сопоставления между различными случаями.

1
ответ дан 14 December 2019 в 19:12
поделиться

Думаю, у вас могут возникнуть проблемы. В разделе 6.4.2.1 спецификации языка C сказано: "Строчные и прописные буквы различаются" в отношении идентификаторов. Это означает, что для вашего компилятора и компоновщика _DGEQP3 и _dgeqp3 - это разные символы. Возможно, вы можете добавить несколько #define в заголовок для конкретной платформы, чтобы выстроить все в ряд.

Эта ошибка появилась из-за того, что вы линкуете с библиотекой windows, а не с той, которую вы использовали раньше?

2
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: