gcc игнорирует регистр имен символов при связывании - PullRequest
5 голосов
/ 14 февраля 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 16 февраля 2010

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

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

  • с использованием #define s
  • с использованием интерфейсов C для BLAS и LAPACK.
2 голосов
/ 14 февраля 2010

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

Это потому, что вы ссылаетесь на библиотеку Windows, а не на то, что использовали до того, как появилась эта ошибка?

1 голос
/ 14 февраля 2010

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

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

...