5 Stimmen

gcc ignoriert das Gehäuse von Symbolnamen beim Linken

Eine Software, an der ich arbeite, wird mit NETLIB BLAS/LAPACK ausgeliefert, das in den Quellcode eingebettet ist und Symbolnamen in Kleinbuchstaben verwendet. Beim Portieren der Anwendung auf Windows habe ich jedoch entdeckt, dass Intel MKL und mehrere andere BLAS/LAPACK-Implementierungen für diese Plattform Symbolnamen in Großbuchstaben verwenden. Gibt es eine Möglichkeit, dem Gnu-Compiler/Linker mitzuteilen, dass er die Groß-/Kleinschreibung beim Abgleich der Symbolnamen ignorieren soll?

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

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

2voto

Carl Norum Punkte 210051

Ich glaube, Sie könnten Schwierigkeiten bekommen. Abschnitt 6.4.2.1 der C-Spezifikation besagt, dass Klein- und Großbuchstaben in Bezug auf Bezeichner zu unterscheiden sind. Das bedeutet, dass, soweit Ihr Compiler und Linker betroffen sind, _DGEQP3 y _dgeqp3 sind unterschiedliche Symbole. Sie können wahrscheinlich einige #define Anweisungen in einer plattformspezifischen Kopfzeile, um die Dinge für Sie zu ordnen.

Ist es, weil Sie gegen eine Windows-Bibliothek verknüpfen, anstatt was auch immer Sie vorher verwendet haben, dass dieser Fehler aufgetaucht ist?

2voto

F'x Punkte 11875

Der Unterschied, den Sie sehen, ist auf Fortran-Aufrufkonventionen zurückzuführen: In Fortran ist die Groß-/Kleinschreibung von Symbolen unwichtig, und daher hat jeder Compiler eine Möglichkeit, Fortran-Symbolnamen in Assembler-Symbolnamen zu übersetzen: GNU-Compiler übersetzen in der Regel alles in Kleinbuchstaben, Intel unter Windows wählt Großbuchstaben.

Wenn Sie mit Fortran-Code arbeiten, können Sie die -fsymbol-case-upper Option auf dem älteren g77 Compiler (der neuere gfortran Compiler hat dies nicht). Ansonsten gibt es keine einfache Antwort für C, außer:

  • mit #define 's
  • unter Verwendung der C-Schnittstellen zu BLAS und LAPACK.

1voto

Cetin Sert Punkte 4353

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

scheint es eine Möglichkeit zu geben, Symbol-Aliase zur Link-Zeit einzuführen, indem man --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 ~
$

Es muss auch eine Möglichkeit geben, dem Linker verschiedene Skripte zu geben, um eine große Anzahl solcher Symboldefinitionen zu behandeln. So könnte ich es zu einem Teil des Build-Prozesses machen, automatisch Linker-Skripte zu erstellen, die Mappings zwischen verschiedenen Fällen erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X